Distribution of non-B DNA motifs across weak and strong splice sites
We calculated the distribution of non-B DNA motifs across quartiles of splice strength, where Q1 are the weakest splice sites and Q4 are the strongest.
Merge_Qs <- function(Qs.list, window_len, strand ) {
Total_Qs <- data.table(rbindlist(Qs.list))
Q_names <- seq(nrow(Total_Qs)/window_len)
Total_Qs[, Q:=rep(Q_names, each=window_len)]
if(strand=="-"){
Total_Qs[,Position:=Position*-1]
}
Total_Qs
}
merge_plus_minus <- function(plus, minus){
TOTAL <- merge(plus, minus, by=c("Position", "Q") )
TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
TOTAL[,median:=median(Occurrences), by=c("Q")]
TOTAL[, Enrrichment:=Occurrences/median]
TOTAL[, Position:=Position-1]
}
Merge_up_down <- function(Qs.up, Qs.down){
Qs.total <- rbind(Qs.up, Qs.down)
half_n <- nrow(Qs.total)/2
Qs.total[, exon_pos:=rep(c("Upstream", "Downstream"), each=half_n) ]
Qs.total$exon_pos <- factor(Qs.total$exon_pos, levels=c("Upstream", "Downstream" ))
Qs.total$Q <- factor(Qs.total$Q)
Qs.total
}
get_total_Qs <- function(Qs.plus.up.list, Qs.minus.list, Qs.plus.down.list, Qs.minus.down.list, window_len){
Qs.plus.up <- Merge_Qs(Qs.plus.up.list, window_len, strand="+")
Qs.minus.up <- Merge_Qs(Qs.minus.list, window_len, strand="-")
Qs.up <- merge_plus_minus(Qs.plus.up, Qs.minus.up)
Qs.plus.down <- Merge_Qs(Qs.plus.down.list, window_len, strand="+")
Qs.minus.down<- Merge_Qs(Qs.minus.down.list, window_len, strand="-")
Qs.down <- merge_plus_minus(Qs.plus.down, Qs.minus.down)
Qs.total <- Merge_up_down(Qs.up, Qs.down)
Qs.total
}
G4.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num'
G4.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num'
G4.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num'
G4.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num'
G4.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num'
G4.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num'
G4.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num'
G4.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num'
G4.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num'
G4.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num'
G4.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num'
G4.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num'
G4.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num'
G4.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num'
G4.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num'
G4.Q4_down_minus <- read_dist_table(".//All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './/All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num'
G4.Qs.plus.up.list <- list(G4.Q1_up_plus, G4.Q2_up_plus, G4.Q3_up_plus, G4.Q4_up_plus)
G4.Qs.minus.list <- list(G4.Q1_up_minus, G4.Q2_up_minus, G4.Q3_up_minus, G4.Q4_up_minus)
G4.Qs.plus.down.list <- list(G4.Q1_down_plus, G4.Q2_down_plus, G4.Q3_down_plus, G4.Q4_down_plus)
G4.Qs.minus.down.list <- list(G4.Q1_down_minus, G4.Q2_down_minus, G4.Q3_down_minus, G4.Q4_down_minus)
G4.window_len = 2000
G4.Qs.total <- get_total_Qs(G4.Qs.plus.up.list, G4.Qs.minus.list, G4.Qs.plus.down.list, G4.Qs.minus.down.list, G4.window_len)
G4.Qs.total$Q <- mapvalues(G4.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw()+labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

We calculated the binomial confidence intervals given the total number of exon in each quartile
hg19.nexons <- 123433 + 123936 #Number of exons found in each side
G4.Qs.total.binomial <- cbind(G4.Qs.total, G4.Qs.total[, binconf(Occurrences, hg19.nexons/4) ])
G4.Qs.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q")]
G4.Qs.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
ggplot(G4.Qs.total.binomial)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
geom_ribbon(aes(x=Position,y=Enrrichment, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
xlim(c(-150,150)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw()+labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

Then we explored the enrichment in other non-B DNA motifs
DR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.DRs.list.out.num")
DR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.DRs.list.out.num")
DR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.DRs.list.out.num")
DR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.DRs.list.out.num")
DR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.DRs.list.out.num")
DR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.DRs.list.out.num")
DR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.DRs.list.out.num")
DR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.DRs.list.out.num")
DR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.DRs.list.out.num")
DR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.DRs.list.out.num")
DR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.DRs.list.out.num")
DR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.DRs.list.out.num")
DR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.DRs.list.out.num")
DR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.DRs.list.out.num")
DR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.DRs.list.out.num")
DR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.DRs.list.out.num")
DR.Qs.plus.up.list <- list(DR.Q1_up_plus, DR.Q2_up_plus, DR.Q3_up_plus, DR.Q4_up_plus)
DR.Qs.minus.list <- list(DR.Q1_up_minus, DR.Q2_up_minus, DR.Q3_up_minus, DR.Q4_up_minus)
DR.Qs.plus.down.list <- list(DR.Q1_down_plus, DR.Q2_down_plus, DR.Q3_down_plus, DR.Q4_down_plus)
DR.Qs.minus.down.list <- list(DR.Q1_down_minus, DR.Q2_down_minus, DR.Q3_down_minus, DR.Q4_down_minus)
DR.window_len = 2000
DR.Qs.total <- get_total_Qs(DR.Qs.plus.up.list, DR.Qs.minus.list, DR.Qs.plus.down.list, DR.Qs.minus.down.list, DR.window_len)
H_DNA.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.H_DNA.list.out.num")
H_DNA.Qs.plus.up.list <- list(H_DNA.Q1_up_plus, H_DNA.Q2_up_plus, H_DNA.Q3_up_plus, H_DNA.Q4_up_plus)
H_DNA.Qs.minus.list <- list(H_DNA.Q1_up_minus, H_DNA.Q2_up_minus, H_DNA.Q3_up_minus, H_DNA.Q4_up_minus)
H_DNA.Qs.plus.down.list <- list(H_DNA.Q1_down_plus, H_DNA.Q2_down_plus, H_DNA.Q3_down_plus, H_DNA.Q4_down_plus)
H_DNA.Qs.minus.down.list <- list(H_DNA.Q1_down_minus, H_DNA.Q2_down_minus, H_DNA.Q3_down_minus, H_DNA.Q4_down_minus)
H_DNA.window_len = 2000
H_DNA.Qs.total <- get_total_Qs(H_DNA.Qs.plus.up.list, H_DNA.Qs.minus.list, H_DNA.Qs.plus.down.list, H_DNA.Qs.minus.down.list, H_DNA.window_len)
IR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.IRs.list.out.num")
IR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.IRs.list.out.num")
IR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.IRs.list.out.num")
IR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.IRs.list.out.num")
IR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.IRs.list.out.num")
IR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.IRs.list.out.num")
IR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.IRs.list.out.num")
IR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.IRs.list.out.num")
IR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.IRs.list.out.num")
IR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.IRs.list.out.num")
IR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.IRs.list.out.num")
IR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.IRs.list.out.num")
IR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.IRs.list.out.num")
IR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.IRs.list.out.num")
IR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.IRs.list.out.num")
IR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.IRs.list.out.num")
IR.Qs.plus.up.list <- list(IR.Q1_up_plus, IR.Q2_up_plus, IR.Q3_up_plus, IR.Q4_up_plus)
IR.Qs.minus.list <- list(IR.Q1_up_minus, IR.Q2_up_minus, IR.Q3_up_minus, IR.Q4_up_minus)
IR.Qs.plus.down.list <- list(IR.Q1_down_plus, IR.Q2_down_plus, IR.Q3_down_plus, IR.Q4_down_plus)
IR.Qs.minus.down.list <- list(IR.Q1_down_minus, IR.Q2_down_minus, IR.Q3_down_minus, IR.Q4_down_minus)
IR.window_len = 2000
IR.Qs.total <- get_total_Qs(IR.Qs.plus.up.list, IR.Qs.minus.list, IR.Qs.plus.down.list, IR.Qs.minus.down.list, IR.window_len)
MR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.MRs.list.out.num")
MR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.MRs.list.out.num")
MR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.MRs.list.out.num")
MR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.MRs.list.out.num")
MR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.MRs.list.out.num")
MR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.MRs.list.out.num")
MR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.MRs.list.out.num")
MR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.MRs.list.out.num")
MR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.MRs.list.out.num")
MR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.MRs.list.out.num")
MR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.MRs.list.out.num")
MR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.MRs.list.out.num")
MR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.MRs.list.out.num")
MR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.MRs.list.out.num")
MR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.MRs.list.out.num")
MR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.MRs.list.out.num")
MR.Qs.plus.up.list <- list(MR.Q1_up_plus, MR.Q2_up_plus, MR.Q3_up_plus, MR.Q4_up_plus)
MR.Qs.minus.list <- list(MR.Q1_up_minus, MR.Q2_up_minus, MR.Q3_up_minus, MR.Q4_up_minus)
MR.Qs.plus.down.list <- list(MR.Q1_down_plus, MR.Q2_down_plus, MR.Q3_down_plus, MR.Q4_down_plus)
MR.Qs.minus.down.list <- list(MR.Q1_down_minus, MR.Q2_down_minus, MR.Q3_down_minus, MR.Q4_down_minus)
MR.window_len = 2000
MR.Qs.total <- get_total_Qs(MR.Qs.plus.up.list, MR.Qs.minus.list, MR.Qs.plus.down.list, MR.Qs.minus.down.list, MR.window_len)
STR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.STRs.list.out.num")
STR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.STRs.list.out.num")
STR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.STRs.list.out.num")
STR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.STRs.list.out.num")
STR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.STRs.list.out.num")
STR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.STRs.list.out.num")
STR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.STRs.list.out.num")
STR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.STRs.list.out.num")
STR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.STRs.list.out.num")
STR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.STRs.list.out.num")
STR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.STRs.list.out.num")
STR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.STRs.list.out.num")
STR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.STRs.list.out.num")
STR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.STRs.list.out.num")
STR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.STRs.list.out.num")
STR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.STRs.list.out.num")
STR.Qs.plus.up.list <- list(STR.Q1_up_plus, STR.Q2_up_plus, STR.Q3_up_plus, STR.Q4_up_plus)
STR.Qs.minus.list <- list(STR.Q1_up_minus, STR.Q2_up_minus, STR.Q3_up_minus, STR.Q4_up_minus)
STR.Qs.plus.down.list <- list(STR.Q1_down_plus, STR.Q2_down_plus, STR.Q3_down_plus, STR.Q4_down_plus)
STR.Qs.minus.down.list <- list(STR.Q1_down_minus, STR.Q2_down_minus, STR.Q3_down_minus, STR.Q4_down_minus)
STR.window_len = 2000
STR.Qs.total <- get_total_Qs(STR.Qs.plus.up.list, STR.Qs.minus.list, STR.Qs.plus.down.list, STR.Qs.minus.down.list, STR.window_len)
Z_DNA.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Qs.plus.up.list <- list(Z_DNA.Q1_up_plus, Z_DNA.Q2_up_plus, Z_DNA.Q3_up_plus, Z_DNA.Q4_up_plus)
Z_DNA.Qs.minus.list <- list(Z_DNA.Q1_up_minus, Z_DNA.Q2_up_minus, Z_DNA.Q3_up_minus, Z_DNA.Q4_up_minus)
Z_DNA.Qs.plus.down.list <- list(Z_DNA.Q1_down_plus, Z_DNA.Q2_down_plus, Z_DNA.Q3_down_plus, Z_DNA.Q4_down_plus)
Z_DNA.Qs.minus.down.list <- list(Z_DNA.Q1_down_minus, Z_DNA.Q2_down_minus, Z_DNA.Q3_down_minus, Z_DNA.Q4_down_minus)
Z_DNA.window_len = 2000
Z_DNA.Qs.total <- get_total_Qs(Z_DNA.Qs.plus.up.list, Z_DNA.Qs.minus.list, Z_DNA.Qs.plus.down.list, Z_DNA.Qs.minus.down.list, Z_DNA.window_len)
G4.Qs.total[, Non_B:="G4"]
DR.Qs.total[, Non_B:="DR"]
H_DNA.Qs.total[, Non_B:="H-DNA"]
IR.Qs.total[, Non_B:="IR"]
MR.Qs.total[, Non_B:="MR"]
STR.Qs.total[, Non_B:="STR"]
Z_DNA.Qs.total[, Non_B:="Z-DNA"]
Non_B.Qs.TOTAL <- rbind(G4.Qs.total, DR.Qs.total, H_DNA.Qs.total, IR.Qs.total, MR.Qs.total, STR.Qs.total, Z_DNA.Qs.total)
Non_B.Qs.TOTAL$Q <- mapvalues(Non_B.Qs.TOTAL$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(Non_B.Qs.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( Non_B ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

Non_B.Qs.TOTAL.Enrrichment_Peak <- Non_B.Qs.TOTAL[ , .(Enrrichment_Peak=max(Enrrichment)) , by= c("Non_B", "exon_pos", "Q")]
write.table(Non_B.Qs.TOTAL.Enrrichment_Peak, file = "./Tables/Non_B.Qs.TOTAL.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
G4 seq
Here we distribution of G4-seq experiments

G4_2019.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Qs.plus.up.list <- list(G4_2019.PDS.Q1_up_plus, G4_2019.PDS.Q2_up_plus, G4_2019.PDS.Q3_up_plus, G4_2019.PDS.Q4_up_plus)
G4_2019.PDS.Qs.minus.list <- list(G4_2019.PDS.Q1_up_minus, G4_2019.PDS.Q2_up_minus, G4_2019.PDS.Q3_up_minus, G4_2019.PDS.Q4_up_minus)
G4_2019.PDS.Qs.plus.down.list <- list(G4_2019.PDS.Q1_down_plus, G4_2019.PDS.Q2_down_plus, G4_2019.PDS.Q3_down_plus, G4_2019.PDS.Q4_down_plus)
G4_2019.PDS.Qs.minus.down.list <- list(G4_2019.PDS.Q1_down_minus, G4_2019.PDS.Q2_down_minus, G4_2019.PDS.Q3_down_minus, G4_2019.PDS.Q4_down_minus)
G4_2019.PDS.window_len = 2000
G4_2019.PDS.Qs.total <- get_total_Qs(G4_2019.PDS.Qs.plus.up.list, G4_2019.PDS.Qs.minus.list, G4_2019.PDS.Qs.plus.down.list, G4_2019.PDS.Qs.minus.down.list, G4_2019.PDS.window_len)
ggplot(G4_2019.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Qs.plus.up.list <- list(G4_2019.template.PDS.Q1_up_plus, G4_2019.template.PDS.Q2_up_plus, G4_2019.template.PDS.Q3_up_plus, G4_2019.template.PDS.Q4_up_plus)
G4_2019.template.PDS.Qs.minus.list <- list(G4_2019.template.PDS.Q1_up_minus, G4_2019.template.PDS.Q2_up_minus, G4_2019.template.PDS.Q3_up_minus, G4_2019.template.PDS.Q4_up_minus)
G4_2019.template.PDS.Qs.plus.down.list <- list(G4_2019.template.PDS.Q1_down_plus, G4_2019.template.PDS.Q2_down_plus, G4_2019.template.PDS.Q3_down_plus, G4_2019.template.PDS.Q4_down_plus)
G4_2019.template.PDS.Qs.minus.down.list <- list(G4_2019.template.PDS.Q1_down_minus, G4_2019.template.PDS.Q2_down_minus, G4_2019.template.PDS.Q3_down_minus, G4_2019.template.PDS.Q4_down_minus)
G4_2019.template.PDS.window_len = 2000
G4_2019.template.PDS.Qs.total <- get_total_Qs(G4_2019.template.PDS.Qs.plus.up.list, G4_2019.template.PDS.Qs.minus.list, G4_2019.template.PDS.Qs.plus.down.list, G4_2019.template.PDS.Qs.minus.down.list, G4_2019.template.PDS.window_len)
G4_2019.non_template.PDS.Qs.plus.up.list <- list(G4_2019.non_template.PDS.Q1_up_plus, G4_2019.non_template.PDS.Q2_up_plus, G4_2019.non_template.PDS.Q3_up_plus, G4_2019.non_template.PDS.Q4_up_plus)
G4_2019.non_template.PDS.Qs.minus.list <- list(G4_2019.non_template.PDS.Q1_up_minus, G4_2019.non_template.PDS.Q2_up_minus, G4_2019.non_template.PDS.Q3_up_minus, G4_2019.non_template.PDS.Q4_up_minus)
G4_2019.non_template.PDS.Qs.plus.down.list <- list(G4_2019.non_template.PDS.Q1_down_plus, G4_2019.non_template.PDS.Q2_down_plus, G4_2019.non_template.PDS.Q3_down_plus, G4_2019.non_template.PDS.Q4_down_plus)
G4_2019.non_template.PDS.Qs.minus.down.list <- list(G4_2019.non_template.PDS.Q1_down_minus, G4_2019.non_template.PDS.Q2_down_minus, G4_2019.non_template.PDS.Q3_down_minus, G4_2019.non_template.PDS.Q4_down_minus)
G4_2019.non_template.PDS.window_len = 2000
G4_2019.non_template.PDS.Qs.total <- get_total_Qs(G4_2019.non_template.PDS.Qs.plus.up.list, G4_2019.non_template.PDS.Qs.minus.list, G4_2019.non_template.PDS.Qs.plus.down.list, G4_2019.non_template.PDS.Qs.minus.down.list, G4_2019.non_template.PDS.window_len)
G4_2019.template_non_template.PDS.Qs.total <- rbind(G4_2019.template.PDS.Qs.total, G4_2019.non_template.PDS.Qs.total)
half_n <- nrow(G4_2019.template_non_template.PDS.Qs.total)/2
G4_2019.template_non_template.PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2019.template_non_template.PDS.Qs.total$Strand <- factor(G4_2019.template_non_template.PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2019.template_non_template.PDS.Qs.total$Q <- mapvalues(G4_2019.template_non_template.PDS.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template_non_template.PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2019.template_non_template.PDS.Qs.total$new_Strand <- factor(G4_2019.template_non_template.PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.K.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Qs.plus.up.list <- list(G4_2019.template.K.Q1_up_plus, G4_2019.template.K.Q2_up_plus, G4_2019.template.K.Q3_up_plus, G4_2019.template.K.Q4_up_plus)
G4_2019.template.K.Qs.minus.list <- list(G4_2019.template.K.Q1_up_minus, G4_2019.template.K.Q2_up_minus, G4_2019.template.K.Q3_up_minus, G4_2019.template.K.Q4_up_minus)
G4_2019.template.K.Qs.plus.down.list <- list(G4_2019.template.K.Q1_down_plus, G4_2019.template.K.Q2_down_plus, G4_2019.template.K.Q3_down_plus, G4_2019.template.K.Q4_down_plus)
G4_2019.template.K.Qs.minus.down.list <- list(G4_2019.template.K.Q1_down_minus, G4_2019.template.K.Q2_down_minus, G4_2019.template.K.Q3_down_minus, G4_2019.template.K.Q4_down_minus)
G4_2019.template.K.window_len = 2000
G4_2019.template.K.Qs.total <- get_total_Qs(G4_2019.template.K.Qs.plus.up.list, G4_2019.template.K.Qs.minus.list, G4_2019.template.K.Qs.plus.down.list, G4_2019.template.K.Qs.minus.down.list, G4_2019.template.K.window_len)
G4_2019.non_template.K.Qs.plus.up.list <- list(G4_2019.non_template.K.Q1_up_plus, G4_2019.non_template.K.Q2_up_plus, G4_2019.non_template.K.Q3_up_plus, G4_2019.non_template.K.Q4_up_plus)
G4_2019.non_template.K.Qs.minus.list <- list(G4_2019.non_template.K.Q1_up_minus, G4_2019.non_template.K.Q2_up_minus, G4_2019.non_template.K.Q3_up_minus, G4_2019.non_template.K.Q4_up_minus)
G4_2019.non_template.K.Qs.plus.down.list <- list(G4_2019.non_template.K.Q1_down_plus, G4_2019.non_template.K.Q2_down_plus, G4_2019.non_template.K.Q3_down_plus, G4_2019.non_template.K.Q4_down_plus)
G4_2019.non_template.K.Qs.minus.down.list <- list(G4_2019.non_template.K.Q1_down_minus, G4_2019.non_template.K.Q2_down_minus, G4_2019.non_template.K.Q3_down_minus, G4_2019.non_template.K.Q4_down_minus)
G4_2019.non_template.K.window_len = 2000
G4_2019.non_template.K.Qs.total <- get_total_Qs(G4_2019.non_template.K.Qs.plus.up.list, G4_2019.non_template.K.Qs.minus.list, G4_2019.non_template.K.Qs.plus.down.list, G4_2019.non_template.K.Qs.minus.down.list, G4_2019.non_template.K.window_len)
G4_2019.template.K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 825 903.0 0.9136213 840 854 0.9836066 1665 1741 0.9563469 Upstream
2: -1000 2 673 716.0 0.9399441 638 684 0.9327485 1311 1408 0.9311080 Upstream
3: -1000 3 555 567.0 0.9788360 592 546 1.0842491 1147 1116 1.0277778 Upstream
4: -1000 4 413 370.0 1.1162162 364 370 0.9837838 777 749 1.0373832 Upstream
5: -999 1 833 903.0 0.9224806 845 854 0.9894614 1678 1741 0.9638139 Upstream
---
15988: 997 4 480 540.0 0.8888889 474 540 0.8777778 954 1093 0.8728271 Downstream
15989: 998 1 579 698.0 0.8295129 561 640 0.8765625 1140 1347 0.8463252 Downstream
15990: 998 2 560 680.0 0.8235294 527 657 0.8021309 1087 1334 0.8148426 Downstream
15991: 998 3 504 590.5 0.8535140 472 595 0.7932773 976 1192 0.8187919 Downstream
15992: 998 4 484 540.0 0.8962963 474 540 0.8777778 958 1093 0.8764867 Downstream
G4_2019.non_template.K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 682 749 0.9105474 697 726 0.9600551 1379 1471 0.9374575 Upstream
2: -1000 2 564 618 0.9126214 573 594 0.9646465 1137 1212 0.9381188 Upstream
3: -1000 3 455 469 0.9701493 455 450 1.0111111 910 920 0.9891304 Upstream
4: -1000 4 339 341 0.9941349 345 324 1.0648148 684 665 1.0285714 Upstream
5: -999 1 685 749 0.9145527 695 726 0.9573003 1380 1471 0.9381373 Upstream
---
15988: 997 4 475 505 0.9405941 453 471 0.9617834 928 969 0.9576883 Downstream
15989: 998 1 614 600 1.0233333 494 558 0.8853047 1108 1151 0.9626412 Downstream
15990: 998 2 553 567 0.9753086 542 548 0.9890511 1095 1113 0.9838275 Downstream
15991: 998 3 530 523 1.0133843 461 494 0.9331984 991 1014 0.9773176 Downstream
15992: 998 4 474 505 0.9386139 456 471 0.9681529 930 969 0.9597523 Downstream
G4_2019.template_non_template.K.Qs.total <- rbind(G4_2019.template.K.Qs.total, G4_2019.non_template.K.Qs.total)
half_n <- nrow(G4_2019.template_non_template.K.Qs.total)/2
G4_2019.template_non_template.K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2019.template_non_template.K.Qs.total$Strand <- factor(G4_2019.template_non_template.K.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2019.template_non_template.K.Qs.total$Q <- mapvalues(G4_2019.template_non_template.K.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2019.template_non_template.K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2019.template_non_template.K.Qs.total$new_Strand <- factor(G4_2019.template_non_template.K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

#2015
G4_2015.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Qs.plus.up.list <- list(G4_2015.Na_PDS.Q1_up_plus, G4_2015.Na_PDS.Q2_up_plus, G4_2015.Na_PDS.Q3_up_plus, G4_2015.Na_PDS.Q4_up_plus)
G4_2015.Na_PDS.Qs.minus.list <- list(G4_2015.Na_PDS.Q1_up_minus, G4_2015.Na_PDS.Q2_up_minus, G4_2015.Na_PDS.Q3_up_minus, G4_2015.Na_PDS.Q4_up_minus)
G4_2015.Na_PDS.Qs.plus.down.list <- list(G4_2015.Na_PDS.Q1_down_plus, G4_2015.Na_PDS.Q2_down_plus, G4_2015.Na_PDS.Q3_down_plus, G4_2015.Na_PDS.Q4_down_plus)
G4_2015.Na_PDS.Qs.minus.down.list <- list(G4_2015.Na_PDS.Q1_down_minus, G4_2015.Na_PDS.Q2_down_minus, G4_2015.Na_PDS.Q3_down_minus, G4_2015.Na_PDS.Q4_down_minus)
G4_2015.Na_PDS.window_len = 2000
G4_2015.Na_PDS.Qs.total <- get_total_Qs(G4_2015.Na_PDS.Qs.plus.up.list, G4_2015.Na_PDS.Qs.minus.list, G4_2015.Na_PDS.Qs.plus.down.list, G4_2015.Na_PDS.Qs.minus.down.list, G4_2015.Na_PDS.window_len)
ggplot(G4_2015.Na_PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Qs.plus.up.list <- list(G4_2015.Na_K.Q1_up_plus, G4_2015.Na_K.Q2_up_plus, G4_2015.Na_K.Q3_up_plus, G4_2015.Na_K.Q4_up_plus)
G4_2015.Na_K.Qs.minus.list <- list(G4_2015.Na_K.Q1_up_minus, G4_2015.Na_K.Q2_up_minus, G4_2015.Na_K.Q3_up_minus, G4_2015.Na_K.Q4_up_minus)
G4_2015.Na_K.Qs.plus.down.list <- list(G4_2015.Na_K.Q1_down_plus, G4_2015.Na_K.Q2_down_plus, G4_2015.Na_K.Q3_down_plus, G4_2015.Na_K.Q4_down_plus)
G4_2015.Na_K.Qs.minus.down.list <- list(G4_2015.Na_K.Q1_down_minus, G4_2015.Na_K.Q2_down_minus, G4_2015.Na_K.Q3_down_minus, G4_2015.Na_K.Q4_down_minus)
G4_2015.Na_K.window_len = 2000
G4_2015.Na_K.Qs.total <- get_total_Qs(G4_2015.Na_K.Qs.plus.up.list, G4_2015.Na_K.Qs.minus.list, G4_2015.Na_K.Qs.plus.down.list, G4_2015.Na_K.Qs.minus.down.list, G4_2015.Na_K.window_len)
ggplot(G4_2015.Na_K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Qs.plus.up.list <- list(G4_2015.template.Na_PDS.Q1_up_plus, G4_2015.template.Na_PDS.Q2_up_plus, G4_2015.template.Na_PDS.Q3_up_plus, G4_2015.template.Na_PDS.Q4_up_plus)
G4_2015.template.Na_PDS.Qs.minus.list <- list(G4_2015.template.Na_PDS.Q1_up_minus, G4_2015.template.Na_PDS.Q2_up_minus, G4_2015.template.Na_PDS.Q3_up_minus, G4_2015.template.Na_PDS.Q4_up_minus)
G4_2015.template.Na_PDS.Qs.plus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_plus, G4_2015.template.Na_PDS.Q2_down_plus, G4_2015.template.Na_PDS.Q3_down_plus, G4_2015.template.Na_PDS.Q4_down_plus)
G4_2015.template.Na_PDS.Qs.minus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_minus, G4_2015.template.Na_PDS.Q2_down_minus, G4_2015.template.Na_PDS.Q3_down_minus, G4_2015.template.Na_PDS.Q4_down_minus)
G4_2015.template.Na_PDS.window_len = 2000
G4_2015.template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.template.Na_PDS.Qs.plus.up.list, G4_2015.template.Na_PDS.Qs.minus.list, G4_2015.template.Na_PDS.Qs.plus.down.list, G4_2015.template.Na_PDS.Qs.minus.down.list, G4_2015.template.Na_PDS.window_len)
G4_2015.non_template.Na_PDS.Qs.plus.up.list <- list(G4_2015.non_template.Na_PDS.Q1_up_plus, G4_2015.non_template.Na_PDS.Q2_up_plus, G4_2015.non_template.Na_PDS.Q3_up_plus, G4_2015.non_template.Na_PDS.Q4_up_plus)
G4_2015.non_template.Na_PDS.Qs.minus.list <- list(G4_2015.non_template.Na_PDS.Q1_up_minus, G4_2015.non_template.Na_PDS.Q2_up_minus, G4_2015.non_template.Na_PDS.Q3_up_minus, G4_2015.non_template.Na_PDS.Q4_up_minus)
G4_2015.non_template.Na_PDS.Qs.plus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_plus, G4_2015.non_template.Na_PDS.Q2_down_plus, G4_2015.non_template.Na_PDS.Q3_down_plus, G4_2015.non_template.Na_PDS.Q4_down_plus)
G4_2015.non_template.Na_PDS.Qs.minus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_minus, G4_2015.non_template.Na_PDS.Q2_down_minus, G4_2015.non_template.Na_PDS.Q3_down_minus, G4_2015.non_template.Na_PDS.Q4_down_minus)
G4_2015.non_template.Na_PDS.window_len = 2000
G4_2015.non_template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.non_template.Na_PDS.Qs.plus.up.list, G4_2015.non_template.Na_PDS.Qs.minus.list, G4_2015.non_template.Na_PDS.Qs.plus.down.list, G4_2015.non_template.Na_PDS.Qs.minus.down.list, G4_2015.non_template.Na_PDS.window_len)
G4_2015.template.Na_PDS.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 3230 3421 0.9441684 3119 3238.5 0.9631002 6349 6677 0.9508761 Upstream
2: -1000 2 2693 2711 0.9933604 2396 2540.0 0.9433071 5089 5232 0.9726682 Upstream
3: -1000 3 1991 1997 0.9969955 1927 1975.0 0.9756962 3918 3998 0.9799900 Upstream
4: -1000 4 1455 1331 1.0931630 1357 1287.0 1.0543901 2812 2635 1.0671727 Upstream
5: -999 1 3244 3421 0.9482607 3112 3238.5 0.9609387 6356 6677 0.9519245 Upstream
---
15988: 997 4 1716 2058 0.8338192 1686 2051.0 0.8220380 3402 4144 0.8209459 Downstream
15989: 998 1 2169 2586 0.8387471 2143 2386.0 0.8981559 4312 4961 0.8691796 Downstream
15990: 998 2 2130 2578 0.8262219 1926 2395.0 0.8041754 4056 4983 0.8139675 Downstream
15991: 998 3 1854 2200 0.8427273 1865 2153.0 0.8662332 3719 4357 0.8535690 Downstream
15992: 998 4 1716 2058 0.8338192 1684 2051.0 0.8210629 3400 4144 0.8204633 Downstream
G4_2015.non_template.Na_PDS.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 2746 2794.0 0.9828203 2528 2744.0 0.9212828 5274 5538 0.9523294 Upstream
2: -1000 2 2178 2259.0 0.9641434 1987 2130.0 0.9328638 4165 4378 0.9513476 Upstream
3: -1000 3 1591 1697.0 0.9375368 1566 1590.0 0.9849057 3157 3266 0.9666258 Upstream
4: -1000 4 1190 1162.0 1.0240964 1095 1068.0 1.0252809 2285 2223 1.0278902 Upstream
5: -999 1 2736 2794.0 0.9792412 2533 2744.0 0.9231050 5269 5538 0.9514265 Upstream
---
15988: 997 4 1671 1744.0 0.9581422 1540 1686.0 0.9134045 3211 3394 0.9460813 Downstream
15989: 998 1 2109 2196.0 0.9603825 1862 2021.0 0.9213261 3971 4204 0.9445766 Downstream
15990: 998 2 1996 2118.5 0.9421761 1846 2024.5 0.9118301 3842 4140 0.9280193 Downstream
15991: 998 3 1793 1857.0 0.9655358 1733 1799.0 0.9633130 3526 3665 0.9620737 Downstream
15992: 998 4 1672 1744.0 0.9587156 1545 1686.0 0.9163701 3217 3394 0.9478491 Downstream
G4_2015.template_non_template.Na_PDS.Qs.total <- rbind(G4_2015.template.Na_PDS.Qs.total, G4_2015.non_template.Na_PDS.Qs.total)
half_n <- nrow(G4_2015.template_non_template.Na_PDS.Qs.total)/2
G4_2015.template_non_template.Na_PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2015.template_non_template.Na_PDS.Qs.total$Strand <- factor(G4_2015.template_non_template.Na_PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2015.template_non_template.Na_PDS.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_PDS.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand <- factor(G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-300,300)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Qs.plus.up.list <- list(G4_2015.template.Na_K.Q1_up_plus, G4_2015.template.Na_K.Q2_up_plus, G4_2015.template.Na_K.Q3_up_plus, G4_2015.template.Na_K.Q4_up_plus)
G4_2015.template.Na_K.Qs.minus.list <- list(G4_2015.template.Na_K.Q1_up_minus, G4_2015.template.Na_K.Q2_up_minus, G4_2015.template.Na_K.Q3_up_minus, G4_2015.template.Na_K.Q4_up_minus)
G4_2015.template.Na_K.Qs.plus.down.list <- list(G4_2015.template.Na_K.Q1_down_plus, G4_2015.template.Na_K.Q2_down_plus, G4_2015.template.Na_K.Q3_down_plus, G4_2015.template.Na_K.Q4_down_plus)
G4_2015.template.Na_K.Qs.minus.down.list <- list(G4_2015.template.Na_K.Q1_down_minus, G4_2015.template.Na_K.Q2_down_minus, G4_2015.template.Na_K.Q3_down_minus, G4_2015.template.Na_K.Q4_down_minus)
G4_2015.template.Na_K.window_len = 2000
G4_2015.template.Na_K.Qs.total <- get_total_Qs(G4_2015.template.Na_K.Qs.plus.up.list, G4_2015.template.Na_K.Qs.minus.list, G4_2015.template.Na_K.Qs.plus.down.list, G4_2015.template.Na_K.Qs.minus.down.list, G4_2015.template.Na_K.window_len)
G4_2015.non_template.Na_K.Qs.plus.up.list <- list(G4_2015.non_template.Na_K.Q1_up_plus, G4_2015.non_template.Na_K.Q2_up_plus, G4_2015.non_template.Na_K.Q3_up_plus, G4_2015.non_template.Na_K.Q4_up_plus)
G4_2015.non_template.Na_K.Qs.minus.list <- list(G4_2015.non_template.Na_K.Q1_up_minus, G4_2015.non_template.Na_K.Q2_up_minus, G4_2015.non_template.Na_K.Q3_up_minus, G4_2015.non_template.Na_K.Q4_up_minus)
G4_2015.non_template.Na_K.Qs.plus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_plus, G4_2015.non_template.Na_K.Q2_down_plus, G4_2015.non_template.Na_K.Q3_down_plus, G4_2015.non_template.Na_K.Q4_down_plus)
G4_2015.non_template.Na_K.Qs.minus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_minus, G4_2015.non_template.Na_K.Q2_down_minus, G4_2015.non_template.Na_K.Q3_down_minus, G4_2015.non_template.Na_K.Q4_down_minus)
G4_2015.non_template.Na_K.window_len = 2000
G4_2015.non_template.Na_K.Qs.total <- get_total_Qs(G4_2015.non_template.Na_K.Qs.plus.up.list, G4_2015.non_template.Na_K.Qs.minus.list, G4_2015.non_template.Na_K.Qs.plus.down.list, G4_2015.non_template.Na_K.Qs.minus.down.list, G4_2015.non_template.Na_K.window_len)
G4_2015.template.Na_K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 2362 2490.0 0.9485944 2292 2412.0 0.9502488 4654 4893 0.9511547 Upstream
2: -1000 2 1928 1952.0 0.9877049 1753 1901.0 0.9221462 3681 3861 0.9533800 Upstream
3: -1000 3 1549 1514.0 1.0231176 1497 1471.0 1.0176751 3046 2984 1.0207775 Upstream
4: -1000 4 1099 1038.0 1.0587669 1074 1000.0 1.0740000 2173 2036 1.0672888 Upstream
5: -999 1 2356 2490.0 0.9461847 2299 2412.0 0.9531509 4655 4893 0.9513591 Upstream
---
15988: 997 4 1294 1470.5 0.8799728 1309 1463.5 0.8944312 2603 2934 0.8871847 Downstream
15989: 998 1 1609 1914.0 0.8406479 1565 1797.0 0.8708959 3174 3710 0.8555256 Downstream
15990: 998 2 1556 1874.0 0.8303095 1486 1786.0 0.8320269 3042 3657 0.8318294 Downstream
15991: 998 3 1403 1633.0 0.8591549 1386 1618.0 0.8566131 2789 3265 0.8542113 Downstream
15992: 998 4 1294 1470.5 0.8799728 1305 1463.5 0.8916980 2599 2934 0.8858214 Downstream
G4_2015.non_template.Na_K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 1927 2021.0 0.9534884 1792 1970.5 0.9094139 3719 3995 0.9309136 Upstream
2: -1000 2 1575 1674.5 0.9405793 1500 1575.5 0.9520787 3075 3242 0.9484886 Upstream
3: -1000 3 1265 1280.0 0.9882812 1183 1197.0 0.9883041 2448 2474 0.9894907 Upstream
4: -1000 4 930 926.0 1.0043197 870 852.0 1.0211268 1800 1765 1.0198300 Upstream
5: -999 1 1924 2021.0 0.9520040 1795 1970.5 0.9109363 3719 3995 0.9309136 Upstream
---
15988: 997 4 1320 1303.0 1.0130468 1142 1275.0 0.8956863 2462 2566 0.9594700 Downstream
15989: 998 1 1569 1623.0 0.9667283 1369 1523.5 0.8985888 2938 3121 0.9413649 Downstream
15990: 998 2 1468 1579.0 0.9297023 1422 1466.0 0.9699864 2890 3039 0.9509707 Downstream
15991: 998 3 1368 1408.0 0.9715909 1280 1327.0 0.9645818 2648 2734 0.9685443 Downstream
15992: 998 4 1319 1303.0 1.0122794 1145 1275.0 0.8980392 2464 2566 0.9602494 Downstream
G4_2015.template_non_template.Na_K.Qs.total <- rbind(G4_2015.template.Na_K.Qs.total, G4_2015.non_template.Na_K.Qs.total)
half_n <- nrow(G4_2015.template_non_template.Na_K.Qs.total)/2
G4_2015.template_non_template.Na_K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2015.template_non_template.Na_K.Qs.total$Strand <- factor(G4_2015.template_non_template.Na_K.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2015.template_non_template.Na_K.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_K.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_K.Qs.total$new_Strand <- factor(G4_2015.template_non_template.Na_K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-300,300)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

KCl RNA-seq
As K+ is known to stabilize G4, we analized (RNA-seq data)[https://www.ncbi.nlm.nih.gov/bioproject/PRJEB19451] comming from neurons after 4-hour KCl-indused depolarization.
KCL_human_upstream <- fread("../KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s" )
KCL_human_upstream <- fread("../KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s" ) #stop here
colnames(KCL_human_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_human_downstream<- fread("../KCL/MicroExonator/Control_vs_KCL.diff.downstream_100nt.G4s" )
colnames(KCL_human_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_human <- merge(KCL_human_upstream[, c("chrom", "start", "end", "strand", "Type" , "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4") ],
KCL_human_downstream[, c("chrom", "start", "end", "strand", "Type" , "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "Psi_A", "Psi_B", "DeltaPsi", "Probability") )
KCL_human[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_human[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_human$G4_bol <- factor(KCL_human$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_human[end - start > 30, exon:="exon" ]
KCL_human[end - start <= 30, exon:="microexon" ]
size.var=0.5
alpha.var=0.25
ggplot(data=KCL_human[ Type=="CE",]) +
geom_point( aes(x=-DeltaPsi, y=Probability), colour="grey", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi>0.1 & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="skyblue", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi<(-0.1) & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="red", alpha=alpha.var, size=size.var) +
xlim(c(-0.8, 0.8)) +
facet_grid( . ~ G4_bol ) +
xlab("DeltaPSI (Control - KCl)") +
theme_bw()

To highlight NRXN2, SHANK1 and RBM10 we used biomaRt to find the gene name to Ensembl ID correspondence
KCL_human[ Type=="CE"& DeltaPsi>0.1 & Probability>0.9, ]
chrom start end strand Type Psi_A Psi_B DeltaPsi Probability G4.x G4.y G4_bol exon
1: chr1 898717 898884 + CE 0.98048 0.87592 0.10456 0.983 0 0 Without G-quadruplex exon
2: chr1 998459 998581 + CE 0.85834 0.19319 0.66515 1.000 0 0 Without G-quadruplex exon
3: chr1 1417925 1417994 + CE 0.98218 0.79026 0.19193 1.000 0 0 Without G-quadruplex exon
4: chr1 1420396 1420551 + CE 0.98311 0.86868 0.11443 0.989 0 1 With G-quadruplex exon
5: chr1 1425072 1425191 + CE 0.38275 0.12733 0.25542 0.995 1 0 With G-quadruplex exon
---
2330: chrX 133372809 133372870 + CE 0.62780 0.26360 0.36421 0.968 0 0 Without G-quadruplex exon
2331: chrX 149882951 149883001 + CE 0.48758 0.21579 0.27179 0.976 0 0 Without G-quadruplex exon
2332: chrX 153224020 153224217 - CE 0.90752 0.73220 0.17532 0.999 0 0 Without G-quadruplex exon
2333: chrX 153585619 153585642 - CE 0.50841 0.26592 0.24249 0.999 0 0 Without G-quadruplex microexon
2334: chrX 153872153 153872305 - CE 0.91368 0.71626 0.19742 0.923 1 0 With G-quadruplex exon
KCL_human[, Coords:=paste(chrom, paste(start, end, sep = "-"), strand, sep=":" )]
whippet.jls.exons.hg19 <- fread("../KCL/whippet.jls.exons.tab")
KCL_human_CE <- merge(KCL_human[Type=="CE", ], whippet.jls.exons.hg19, by.x="Coords", by.y="Potential_Exon")
KCL_human_CE[ , ensembl_gene_id:=vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)]
KCL_human_CE_genes <- data.table(getBM(attributes=c('ensembl_gene_id', "wikigene_description", "hgnc_symbol"),filters = 'ensembl_gene_id', values = unique(vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)) , mart = ensembl))
KCL_human_CE <- merge(KCL_human_CE, KCL_human_CE_genes, by="ensembl_gene_id")
KCL_human_CE[ Type=="CE"& DeltaPsi>0.1 & Probability>0.9, ]
ensembl_gene_id Coords chrom start end strand Type Psi_A Psi_B DeltaPsi Probability G4.x G4.y
1: ENSG00000001084 chr6:53380907-53381015:- chr6 53380907 53381015 - CE 0.97612 0.87381 0.10231 0.981 0 0
2: ENSG00000001167 chr6:41048550-41048636:+ chr6 41048550 41048636 + CE 0.84244 0.36849 0.47395 1.000 0 0
3: ENSG00000001497 chrX:64740582-64740697:- chrX 64740582 64740697 - CE 0.75403 0.61097 0.14306 0.929 0 0
4: ENSG00000001629 chr7:92021555-92021606:+ chr7 92021555 92021606 + CE 0.91807 0.79402 0.12406 0.939 0 0
5: ENSG00000002016 chr12:1023597-1023698:- chr12 1023597 1023698 - CE 0.93161 0.70463 0.22698 0.927 0 0
---
2414: ENSG00000273025 chr15:72581209-72581271:- chr15 72581209 72581271 - CE 0.67657 0.48694 0.18962 0.912 1 1
2415: ENSG00000273025 chr15:72608186-72608268:- chr15 72608186 72608268 - CE 0.98004 0.83100 0.14904 0.996 0 0
2416: ENSG00000273167 chr13:24591806-24591840:+ chr13 24591806 24591840 + CE 0.86386 0.30902 0.55484 0.988 0 0
2417: ENSG00000273189 chr19:49983809-49983877:+ chr19 49983809 49983877 + CE 0.88601 0.37471 0.51131 0.993 2 2
2418: ENSG00000273247 chr4:140373511-140373651:- chr4 140373511 140373651 - CE 0.79885 0.61443 0.18442 0.917 0 0
G4_bol exon Gene Whippet_Nodes Is_Annotated wikigene_description hgnc_symbol
1: Without G-quadruplex exon ENSG00000001084.6 14 Y glutamate-cysteine ligase catalytic subunit GCLC
2: Without G-quadruplex exon ENSG00000001167.10 4 Y nuclear transcription factor Y subunit alpha NFYA
3: Without G-quadruplex exon ENSG00000001497.12 16 Y LAS1 like ribosome biogenesis factor LAS1L
4: Without G-quadruplex exon ENSG00000001629.5 27 Y ankyrin repeat and IBR domain containing 1 ANKIB1
5: Without G-quadruplex exon ENSG00000002016.12 43 Y RAD52 homolog, DNA repair protein RAD52
---
2414: With G-quadruplex exon ENSG00000273025.1 9 Y
2415: Without G-quadruplex exon ENSG00000273025.1 2 Y
2416: Without G-quadruplex exon ENSG00000273167.1 3 Y
2417: With G-quadruplex exon ENSG00000273189.1 7 Y
2418: Without G-quadruplex exon ENSG00000273247.1 5 Y
Microexons

ME_TOTAL_chi_squared(KCL_human.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 178.44, df = 1, p-value < 2.2e-16
ME_TOTAL_chi_squared(KCL_human.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 178.44, df = 1, p-value < 2.2e-16
ME_TOTAL_chi_squared(KCL_DIV10_Tc1.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 130.71, df = 1, p-value < 2.2e-16
ME_TOTAL_chi_squared(KCL_ESC_CD1.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 326.73, df = 1, p-value < 2.2e-16
ME_TOTAL_chi_squared(KCL_DIV4_CD1.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 342.28, df = 1, p-value < 2.2e-16
ME_TOTAL_chi_squared(KCL_DIV10_CD1.TOTAL_and_ME_stats)
Pearson's Chi-squared test with Yates' continuity correction
data: KCL_human.TOTAL_and_ME_stats.matrix
X-squared = 264.99, df = 1, p-value < 2.2e-16

table(KCL_human.TOTAL_and_ME[ exon_type=="Exon", diff])
Ex In NA
2195 276 109122
install.packages("epiR")
Installing package into ‘/Users/gp7/Library/R/3.5/library’
(as ‘lib’ is unspecified)
also installing the dependency ‘BiasedUrn’
Warning in install.packages :
cannot open URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.5/PACKAGES.rds': HTTP status was '404 Not Found'
trying URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.5/BiasedUrn_1.07.tgz'
Content type 'application/x-gzip' length 421842 bytes (411 KB)
==================================================
downloaded 411 KB
trying URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.5/epiR_1.0-4.tgz'
Content type 'application/x-gzip' length 574632 bytes (561 KB)
==================================================
downloaded 561 KB
The downloaded binary packages are in
/var/folders/0h/z3ycz6gx4rj5_frl6r5wnvbw000g0g/T//RtmpkBU5sY/downloaded_packages
library("ggrepel")
package ‘ggrepel’ was built under R version 3.5.2
validation_exons <-c("chr1:110734594-110734835:+", "chr19:17731502-17731531:-", "chr11:20072835-20072879:+")
Fig5.A <- ggplot(data=KCL_human[ Type=="CE",]) +
geom_point( aes(x=-DeltaPsi, y=Probability), colour="grey", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi>0.1 & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="skyblue", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi<(-0.1) & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="red", alpha=alpha.var, size=size.var) +
xlim(c(-0.8, 0.8)) +
facet_grid( . ~ G4_bol ) +
xlab("DeltaPSI (Control - KCl)") +
theme_bw() +
geom_point(data=KCL_human_CE[Coords %in% validation_exons , ], aes(x=-DeltaPsi, y=Probability), colour="blue", alpha=alpha.var, size=2) +
geom_text_repel(data = KCL_human_CE[Coords %in% validation_exons , ],
colour="black", aes(x=-DeltaPsi, y=Probability),
nudge_y = 3,
direction = "x",
angle = 90,
vjust = 1,
segment.size = 0.2,
label.size = 0.05,
label=KCL_human_CE[Coords %in% validation_exons , hgnc_symbol]) +
ylim(c(0.5, 1.15))
Ignoring unknown parameters: label.size
Fig5.A

To analyse all the Whippet node types, we calculate the odd-ratios of being differentially included given the G4 presence or absence
KCL_human[ , diff:="NA"]
KCL_human[ (DeltaPsi<=-0.1 & Probability>=0.9) , diff:="In"]
KCL_human[ (DeltaPsi>0.1 & Probability>=0.9) , diff:="Ex"]
KCL_human_stats <- merge(KCL_human[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_human[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
Error in .checkTypos(e, names(x)) :
Object 'G4_bol' not found amongst Gene, Node, Coord, Strand, Type and 7 more
We use chi-squared test to calculate the significance
KCL_human_stats.chi <- data.table()
for ( i in unique(KCL_human_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_human_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_human_stats[Type==i & diff=="Ex"]$WO_G4, KCL_human_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_human_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex)
matrix.in <- matrix(nrow=2, c(KCL_human_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_human_stats[Type==i & diff=="In"]$WO_G4, KCL_human_stats[Type==i & diff=="In"]$W_G4_NA, KCL_human_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in)
KCL_human_stats.chi <- rbind(KCL_human_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_human_stats.chi <- rbind(KCL_human_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_human_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_human_stats.chi)
KCL_human_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_human_stats <- merge(KCL_human_stats, KCL_human_stats.chi, by=c("Type", "diff"))
library(plyr)
ggplot(KCL_human_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

splice_node_dot_plot <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex)
matrix.in <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats)
}
upstream.path = "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s"
downstream.path = "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s"
splice_node_dot_plot2 <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.res <- chisq.test(matrix)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, matrix.res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
#KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
#ggplot(KCL_x_stats.chi) +
# geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
# scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
# theme_bw() +
# theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats.chi)
}
diff_G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=((gstart + (gend- gstart)/2) -w.start ) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=((gstart + (gend- gstart)/2)) - w.start ]
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[strand=="+" & ((dist.x >= -dist_lim & dist.x <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[strand=="-" & ((dist.y >= -dist_lim & dist.y <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x <- KCL_x[Type=="CE"]
KCL_x[ , exon_class:="exon"]
KCL_x[end-start<=30, exon_class:="microexon" ]
return(KCL_x)
}
upstream.path = "../Exons_G4s/human.exons.tvs.upstream.G4seq_K"
downstream.path = "../Exons_G4s/human.exons.tvs.downstream.G4seq_K"
G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c( "chrom", "sstart", "send", "strand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
KCL_x <- merge(KCL_x_upstream[, c( "chrom", "start", "end", "strand", "dist") ],
KCL_x_downstream[, c( "chrom", "start", "end", "strand", "dist") ],
by=c( "chrom", "start", "end", "strand") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[ strand=="+" & ((dist.x >= -dist_lim & dist.x <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[ strand=="-" & ((dist.y >= -dist_lim & dist.y <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , exon_class:="exon"]
KCL_x[end-start<=30, exon_class:="microexon" ]
return(KCL_x)
}
human.exons.upstream.G4s.300.stats <-human.exons.upstream.G4s.300[ exon_len<=150, .N , by= c("bin", "G4_bol") ]
Error in eval(bysub, xss, parent.frame()) : object 'bin' not found
human.exons.downstream.G4s <- fread("../Exons_G4s/human.exons.tvs.downstream.G4seq_PDS")
colnames(human.exons.downstream.G4s) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
human.exons.downstream.G4s[ ,dist:=( (gstart + (gend- gstart)/2) - sstart) ]
human.exons.downstream.G4s[ sstrand=="-", dist:=( sstart - (gstart + (gend- gstart)/2)) ]
human.exons.downstream.G4s[, exon_len:=end-start]
human.exons.downstream.G4s[ , G4_bol:="Without G-quadruplex"]
human.exons.downstream.G4s[ dist<=100 & dist>=0 , G4_bol:="With G-quadruplex"]
human.exons.downstream.G4s[, exon_class:="exon"]
human.exons.downstream.G4s[ exon_len<=30, exon_class:="microexon"]
human.exons.downstream.G4s.2x2 <- matrix(ncol = 2,
c(nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test(human.exons.downstream.G4s.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: human.exons.downstream.G4s.2x2
X-squared = 8.2286, df = 1, p-value = 0.004123
human.exons.downstream.G4s[ , ID:=paste(chrom, start, end, sep="_" )]
human.exons.downstream.G4s[, filter:="Out"]
human.exons.downstream.G4s[ ID %in% KCL_human_CE, filter:="In"]
human.exons.downstream.G4s <- human.exons.downstream.G4s[ ID %in% KCL_human_CE, ]
human.exons.downstream.G4s.stats <-human.exons.downstream.G4s[ exon_len<=300, .N , by= c("exon_len", "G4_bol") ]
human.exons.downstream.G4s.stats[, Total:=sum(N), by=exon_len]
human.exons.downstream.G4s.stats[, Percentage:=N*100/Total]
human.exons.downstream.G4s$G4_bol <- factor(human.exons.downstream.G4s$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex"))
ggplot(human.exons.downstream.G4s) +
geom_bar(aes(x=exon_len, fill=G4_bol), position = "fill" ) +
xlim(c(1, 300)) +
geom_vline(xintercept = 30, linetype="dashed", colour="red") +
ylim(c(0, 0.1))

ggplot(human.exons.downstream.G4s.stats[G4_bol=="With G-quadruplex"]) +
geom_bar(aes(x=exon_len, y=Percentage), stat = "identity" ) +
xlim(c(1, 300)) +
geom_vline(xintercept = 30, linetype="dashed", colour="red")

ggplot(human.exons.upstream.G4s) +
geom_bar(aes(x=exon_len, fill=G4_bol), position = "fill" ) +
xlim(c(1, 150)) +
geom_vline(xintercept = 30) +
ylim(c(0.8, 1))

ggplot(hg19_ME_table_G4s) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))

hg19_ME_table_K[, exon_len:=end-start]
ggplot(hg19_ME_table_K) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))

hg19_ME_table_G4s[, median(exon_len), by=G4_bol]
G4_bol V1
1: Without G-quadruplex 147
2: With G-quadruplex 174
hg19_ME_table_K[, median(exon_len), by=G4_bol]
G4_bol V1
1: Without G-quadruplex 147
2: With G-quadruplex 183
ggplot(hg19_ME_table_PDS) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))
Error in FUN(X[[i]], ...) : object 'exon_len' not found

human.ME_g4.stats <- data.table()
hg19_ME_table_G4s <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4s" , "../Exons_G4s/human.exons.tvs.downstream.G4s", 100 )
hg19_ME_table_G4s.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
hg19_ME_table_G4s[ , exon_len:=end-start]
colnames(hg19_ME_table_G4s.2x2) <- c("exon", "microexon")
rownames(hg19_ME_table_G4s.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"motif",
chisq.test( hg19_ME_table_G4s.2x2)$p.value,
(hg19_ME_table_G4s.2x2[ 2 , 2 ]/hg19_ME_table_G4s.2x2[ 1 , 2 ]) / (hg19_ME_table_G4s.2x2[ 2 , 1 ]/hg19_ME_table_G4s.2x2[ 1 , 1 ])
))
hg19_ME_table_K <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4seq_K" , "../Exons_G4s/human.exons.tvs.downstream.G4seq_K", 100 )
hg19_ME_table_K.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_K.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: hg19_ME_table_K.2x2
X-squared = 775.72, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"K+",
chisq.test( hg19_ME_table_K.2x2)$p.value,
(hg19_ME_table_K.2x2[ 2 , 2 ]/hg19_ME_table_K.2x2[ 1 , 2 ]) / (hg19_ME_table_K.2x2[ 2 , 1 ]/hg19_ME_table_K.2x2[ 1 , 1 ])
))
hg19_ME_table_PDS <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4seq_PDS" , "../Exons_G4s/human.exons.tvs.downstream.G4seq_PDS", 100 )
hg19_ME_table_PDS.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_PDS.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: hg19_ME_table_PDS.2x2
X-squared = 1311.3, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"PDS",
chisq.test( hg19_ME_table_PDS.2x2)$p.value,
(hg19_ME_table_PDS.2x2[ 2 , 2 ]/hg19_ME_table_PDS.2x2[ 1 , 2 ]) / (hg19_ME_table_PDS.2x2[ 2 , 1 ]/hg19_ME_table_PDS.2x2[ 1 , 1 ])
))
colnames(human.ME_g4.stats) <- c("G4_signal", "p.value", "OR")
human.ME_g4.stats[, P_value.Bonferroni:=as.numeric(p.value)*3]
ggplot(human.ME_g4.stats) +
geom_point(aes(G4_signal, log2(as.numeric(OR)), size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05 ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")



primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
ESC_derived_neuron_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_Tc1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K", 100 )
total_mouse_K_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: total_mouse_K_ME_table.2x2
X-squared = 1.9867, df = 1, p-value = 0.1587
colnames(total_mouse_K_ME_table.2x2) <- c("exon", "microexon")
rownames(total_mouse_K_ME_table.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
ESC_derived_neuron_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS", 100 )
total_mouse_PDS_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: total_mouse_PDS_ME_table.2x2
X-squared = 3.915e-27, df = 1, p-value = 1
KCL_human[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4s.fix", 100 )
ESC_derived_neuron_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV10_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV10_Tc1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV4_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
All_mouse <- data.table(unique(c(primary_cortical_neuron_DIV4_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV4_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV4_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_motif_ME_table[G4_bol=="With G-quadruplex", ID])))
colnames(All_mouse) <- "ID"
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_motif:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_K:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_PDS:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_PDS:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_PDS:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_PDS:=TRUE ]
All_mouse <- cbind(All_mouse, rowSums(is.na(All_mouse)))
fwrite(All_mouse[order(V2)], "../potassium_experiments/Total_mouse.txt", na="FALSE", sep = "\t", quote=F)
human_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4s" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4s", 100 )
human_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
human_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_PDS", 100 )
human_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
human_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
human_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
All_human<- data.table(unique(c(
human_motif_ME_table[G4_bol=="With G-quadruplex", ID],
human_K_ME_table[G4_bol=="With G-quadruplex", ID],
human_PDS_ME_table[G4_bol=="With G-quadruplex", ID])))
colnames(All_human) <- "ID"
All_human[ ID %in% human_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_motif:=TRUE ]
All_human[ ID %in% human_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_K:=TRUE ]
All_human[ ID %in% human_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_:=TRUE ]
All_human <- cbind(All_human, rowSums(is.na(All_human)))
fwrite(All_human[order(V2)], "../potassium_experiments/Total_human.txt", na="FALSE", sep = "\t", quote=F)
Not working
human_mouse <- fread("../potassium_experiments/human_mouse.0.2.exons")
colnames(human_mouse) <- c("hID", "mID", "score_index")
All_human.mouse <- merge(All_human, human_mouse, by.x="ID", by.y="hID")
All_human.mouse <- merge(All_human.mouse, All_mouse, by.x = "mID", by.y="ID")
All_human.mouse.diff <- All_human.mouse[V2.y<12 & V2.x<3 ]
All_human.mouse.diff
mID ID diff_motif diff_K diff_ V2.x score_index primary_cortical_neuron_DIV4_CD1_motif ESC_derived_neuron_CD1_motif
1: chr10_+_81317326_81317403 chr19_-_3633435_3633518 NA NA TRUE 2 0.000000000 NA NA
2: chr10_-_127662731_127662922 chr12_+_57487190_57487381 TRUE TRUE TRUE 0 0.000000000 NA NA
3: chr11_+_6398262_6398339 chr7_+_44799750_44799827 TRUE TRUE TRUE 0 0.000000000 NA TRUE
4: chr11_+_97491644_97491666 chr17_+_36655174_36655196 NA TRUE TRUE 1 0.043478261 NA NA
5: chr11_-_102310926_102311036 chr17_-_42289712_42289822 TRUE NA NA 2 0.000000000 TRUE TRUE
6: chr11_-_4485879_4485989 chr22_+_30418018_30418128 TRUE TRUE TRUE 0 0.000000000 NA NA
7: chr11_-_69830563_69830613 chr17_+_7315476_7315526 NA TRUE TRUE 1 0.000000000 NA NA
8: chr12_-_84613905_84614044 chr14_-_74764633_74764772 NA NA TRUE 2 0.000000000 NA NA
9: chr13_-_111447896_111447955 chr5_+_56532940_56532999 NA TRUE TRUE 1 0.000000000 NA NA
10: chr14_-_36890342_36890426 chr10_+_86259631_86259715 NA NA TRUE 2 0.000000000 NA NA
11: chr15_+_102519122_102519291 chr12_+_53895844_53895968 NA NA TRUE 2 0.008000000 NA NA
12: chr15_+_99305166_99305193 chr12_+_50026379_50026406 NA NA TRUE 2 0.035714286 NA NA
13: chr16_+_20673599_20673655 chr3_+_184033277_184033333 TRUE NA TRUE 1 0.000000000 NA NA
14: chr16_+_20695739_20695881 chr3_+_184056175_184056317 NA TRUE TRUE 1 0.027972028 NA NA
15: chr16_+_3745777_3745957 chr16_+_3335059_3335239 TRUE NA NA 2 0.000000000 NA NA
16: chr17_+_25818498_25818582 chr16_-_744992_745076 TRUE TRUE TRUE 0 0.000000000 NA NA
17: chr17_-_24182786_24182849 chr16_+_2549358_2549421 NA NA TRUE 2 0.140625000 NA TRUE
18: chr18_+_32430750_32430857 chr2_-_127809831_127809938 TRUE NA NA 2 0.000000000 NA NA
19: chr18_+_74275904_74276071 chr18_-_47800556_47800720 TRUE NA TRUE 1 0.006060606 NA NA
20: chr19_+_6488784_6488810 chr11_-_64421168_64421194 TRUE TRUE TRUE 0 0.037037037 TRUE NA
21: chr19_+_8830888_8830961 chr11_-_62483336_62483409 NA NA TRUE 2 0.000000000 NA NA
22: chr2_+_76560186_76560260 chr2_+_179209013_179209087 NA NA TRUE 2 0.000000000 NA NA
23: chr2_+_91805024_91805110 chr11_-_46534277_46534363 NA NA TRUE 2 0.000000000 NA NA
24: chr2_-_152323172_152323332 chr20_+_401515_401650 TRUE TRUE TRUE 0 0.007352941 NA NA
25: chr2_-_30348555_30348617 chr9_-_131774515_131774577 TRUE TRUE TRUE 0 0.000000000 NA NA
26: chr3_+_88158034_88158171 chr1_-_156450626_156450763 TRUE TRUE TRUE 0 0.000000000 NA NA
27: chr3_+_94989303_94989347 chr1_-_151282687_151282731 TRUE TRUE NA 1 0.022222222 TRUE TRUE
28: chr3_+_95167999_95168100 chr1_-_151111106_151111207 TRUE NA NA 2 0.049019608 TRUE TRUE
29: chr3_-_107477177_107477418 chr1_+_110734594_110734835 TRUE NA TRUE 1 0.000000000 NA NA
30: chr3_-_148860427_148860438 chr1_+_82407718_82407729 NA NA TRUE 2 0.083333333 TRUE NA
31: chr4_+_118410887_118411003 chr1_-_43853981_43854099 TRUE TRUE TRUE 0 0.016806723 NA NA
32: chr4_+_152385724_152385838 chr1_-_6166455_6166569 TRUE NA TRUE 1 0.000000000 NA NA
33: chr4_-_126238522_126238632 chr1_+_36640499_36640609 TRUE NA NA 2 0.000000000 TRUE TRUE
34: chr4_-_129637096_129637187 chr1_+_32650126_32650217 NA NA TRUE 2 0.000000000 NA NA
35: chr5_-_134504734_134504838 chr7_+_73787262_73787366 TRUE TRUE NA 1 0.000000000 TRUE TRUE
36: chr5_-_137301318_137301647 chr7_+_100480386_100480711 NA NA TRUE 2 0.000000000 NA NA
37: chr7_+_123124668_123124715 chr16_+_24741574_24741621 NA NA TRUE 2 0.020833333 NA NA
38: chr7_+_127485928_127485996 chr16_+_30676959_30677027 TRUE NA TRUE 1 0.014492754 TRUE NA
39: chr7_+_127487265_127487336 chr16_+_30678240_30678311 TRUE NA TRUE 1 0.138888889 TRUE NA
40: chr7_+_139852512_139852657 chr10_+_134916201_134916346 NA NA TRUE 2 0.000000000 NA NA
41: chr7_+_49554215_49554259 chr11_+_20072835_20072879 TRUE NA NA 2 0.022222222 NA NA
42: chr7_-_126492449_126492485 chr16_+_28847770_28847806 TRUE NA TRUE 1 0.027027027 NA NA
43: chr7_-_126857226_126857291 chr16_+_30012786_30012851 NA NA TRUE 2 0.000000000 NA NA
44: chr7_-_28895121_28895180 chr19_+_39218956_39219021 NA TRUE TRUE 1 0.090909091 NA NA
45: chr7_-_28895432_28895512 chr19_+_39218586_39218666 NA TRUE TRUE 1 0.000000000 NA NA
46: chr8_+_3600358_3600405 chr19_+_7672707_7672754 TRUE TRUE NA 1 0.020833333 NA NA
47: chr8_-_71636538_71636567 chr19_-_17731502_17731531 TRUE TRUE TRUE 0 0.033333333 TRUE TRUE
48: chr9_+_108838760_108838774 chr3_-_48687708_48687722 NA TRUE TRUE 1 0.066666667 NA NA
49: chr9_+_45912951_45913041 chr11_-_117096647_117096737 NA NA TRUE 2 0.000000000 NA NA
50: chr9_-_119973364_119973678 chr3_-_39185628_39185942 NA NA TRUE 2 0.158730159 NA NA
primary_cortical_neuron_DIV10_CD1_motif primary_cortical_neuron_DIV10_Tc1_motif primary_cortical_neuron_DIV4_CD1_K ESC_derived_neuron_CD1_K primary_cortical_neuron_DIV10_CD1_K
1: NA NA TRUE NA NA
2: NA NA NA NA NA
3: NA NA NA TRUE NA
4: NA NA NA NA NA
5: TRUE NA TRUE TRUE TRUE
6: NA NA NA NA NA
7: NA NA NA NA NA
8: NA NA NA NA NA
9: NA NA TRUE TRUE TRUE
10: NA NA TRUE NA TRUE
11: NA NA NA NA NA
12: NA NA NA NA NA
13: NA NA TRUE NA TRUE
14: NA NA TRUE NA TRUE
15: NA TRUE NA NA NA
16: NA NA TRUE TRUE TRUE
17: NA NA NA TRUE NA
18: NA NA NA TRUE TRUE
19: NA NA NA NA NA
20: NA NA TRUE NA NA
21: NA NA NA NA NA
22: NA NA NA NA NA
23: NA NA TRUE TRUE NA
24: NA TRUE NA NA NA
25: NA NA NA NA NA
26: NA NA TRUE TRUE TRUE
27: NA NA TRUE TRUE NA
28: NA NA NA NA NA
29: NA NA NA NA NA
30: NA NA TRUE NA NA
31: NA TRUE NA NA NA
32: NA TRUE NA NA NA
33: TRUE NA TRUE TRUE TRUE
34: TRUE TRUE NA NA NA
35: TRUE TRUE TRUE TRUE TRUE
36: NA NA NA NA NA
37: NA NA NA NA NA
38: NA TRUE NA NA NA
39: TRUE NA NA NA NA
40: NA NA TRUE NA NA
41: TRUE NA NA NA NA
42: TRUE NA NA NA NA
43: NA NA TRUE NA NA
44: TRUE TRUE NA NA TRUE
45: NA NA NA NA NA
46: NA NA TRUE TRUE TRUE
47: TRUE NA NA NA NA
48: NA NA TRUE NA NA
49: NA NA NA NA NA
50: NA NA NA NA NA
primary_cortical_neuron_DIV10_Tc1_K primary_cortical_neuron_DIV4_CD1_PDS ESC_derived_neuron_CD1_PDS primary_cortical_neuron_DIV10_CD1_PDS primary_cortical_neuron_DIV10_Tc1_PDS V2.y
1: NA NA NA NA NA 11
2: NA TRUE TRUE TRUE TRUE 8
3: NA NA TRUE NA NA 9
4: NA TRUE NA NA NA 11
5: NA TRUE TRUE TRUE NA 3
6: NA NA TRUE NA TRUE 10
7: NA TRUE TRUE TRUE NA 9
8: NA NA NA NA TRUE 11
9: TRUE TRUE TRUE TRUE TRUE 4
10: TRUE TRUE NA TRUE TRUE 6
11: NA TRUE NA TRUE NA 10
12: NA TRUE NA TRUE TRUE 9
13: NA TRUE NA TRUE NA 8
14: TRUE TRUE NA TRUE TRUE 6
15: NA NA NA NA TRUE 10
16: NA NA NA NA NA 9
17: NA NA TRUE NA NA 9
18: NA NA TRUE TRUE NA 8
19: NA TRUE NA NA NA 11
20: NA TRUE NA NA NA 9
21: NA TRUE NA NA NA 11
22: NA TRUE TRUE TRUE TRUE 8
23: TRUE TRUE TRUE NA TRUE 6
24: NA NA NA NA NA 11
25: NA TRUE TRUE NA TRUE 9
26: TRUE TRUE TRUE TRUE TRUE 4
27: NA TRUE TRUE NA NA 6
28: NA NA NA NA NA 10
29: NA TRUE TRUE TRUE TRUE 8
30: NA TRUE NA NA NA 9
31: NA NA NA NA TRUE 10
32: TRUE NA NA NA TRUE 9
33: NA NA NA NA NA 6
34: NA NA NA NA NA 10
35: TRUE NA NA NA NA 4
36: NA NA TRUE NA NA 11
37: TRUE NA NA NA TRUE 10
38: NA TRUE NA NA TRUE 8
39: NA TRUE NA TRUE NA 8
40: TRUE TRUE NA NA TRUE 8
41: NA NA NA NA NA 11
42: NA NA NA TRUE NA 10
43: NA TRUE NA NA NA 10
44: TRUE NA NA NA NA 8
45: NA TRUE NA TRUE NA 10
46: TRUE TRUE TRUE TRUE TRUE 4
47: NA TRUE TRUE TRUE NA 6
48: NA TRUE NA NA NA 10
49: NA NA NA TRUE NA 11
50: NA TRUE NA NA NA 11
[ reached getOption("max.print") -- omitted 3 rows ]
KCL_human_CE[, ID:=paste( chrom, strand, start, end , sep="_")]
All_human.mouse.diff.gene <- merge(All_human.mouse.diff, KCL_human_CE, by="ID")
View(All_human.mouse.diff.gene[order(V2.y, V2.x )][, c("ID", "mID", "V2.x", "V2.y", "wikigene_description", "hgnc_symbol")] )
cat(All_human.mouse.diff.gene[, hgnc_symbol], sep="\n")
ADGRA1
CCSER2
SIDT2
NAV2
PCSK7
AMBRA1
HNRNPUL2
HNRNPUL2
HNRNPUL2-BSCL2
HNRNPUL2-BSCL2
NRXN2
PRPF40B
TARBP2
NAB2
ABCD4
TNRC6A
TBC1D24
ATXN2L
INO80E
FBRS
FBRS
ZNF263
FBXL16
NLGN2
UBTF
MBD1
ACTN4
ACTN4
CAMSAP3
UNC13A
PIP5K1C
SLC6A17
TXLNA
MAP7D1
ADGRL2
SEMA6C
PI4KB
MEF2D
MED8
CHD5
RBCK1
MTMR3
OSBPL6
BIN1
EIF4G1
FAM131A
CSRNP1
CELSR3
GPBP1
SRRT
ZMIZ2
CLIP2
SH3GLB2
RBM10
fwrite(All_human.mouse.diff.gene[order(V2.y, V2.x )][, c("ID", "V2.x", "V2.y", "wikigene_description", "hgnc_symbol")], "../potassium_experiments/human.mouse.diff.G4.gene.txt", na="FALSE", sep = "\t", quote=F)
KCL_human[ID=""]
Error in `[.data.table`(KCL_human, ID = "") : unused argument (ID = "")
total_mouse_PDS_ME_table[G4_bol=="With G-quadruplex", mean(exon_len) ]
Error in mean(exon_len) : object 'exon_len' not found
primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2
X-squared = 2.0509, df = 1, p-value = 0.1521
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2
X-squared = 1.0594, df = 1, p-value = 0.3034
Control_vs_KCL_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: Control_vs_KCL_K_ME_table.2x2
X-squared = 0.026068, df = 1, p-value = 0.8717
Control_vs_KCL_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: Control_vs_KCL_PDS_ME_table.2x2
X-squared = 10.324, df = 1, p-value = 0.001313
splice_node_dot_plot3 <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x[(dist.x>dist_lim & dist.y>dist_lim ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex, correct=TRUE)
matrix.in <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in, correct=TRUE)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats)
}
human.dotplot <- splice_node_dot_plot2("../KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s", "../KCL/MicroExonator/Control_vs_KCL.diff.downstream_100nt.G4s" )
human.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4s",
"../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4s",
100)
human.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K",
45)
human.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_PDS",
45)
human.motif[ , G4_signal:="Motif" ]
human.K[ , G4_signal:="K+" ]
human.PDS[ , G4_signal:="PDS" ]
human.motif_K_PDS <- rbind(human.motif, human.K, human.PDS)
human.motif_K_PDS$G4_signal <- factor(human.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
Fig5.A1 <- ggplot(human.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
Fig5.A1
supp.dotplot.A <- splice_node_dot_plot2("../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s" )
ESC_derived_neuron_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4s.fix",
100)
Chi-squared approximation may be incorrect
ESC_derived_neuron_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
ESC_derived_neuron_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS",
45)
ESC_derived_neuron_CD1.motif[ , G4_signal:="Motif" ]
ESC_derived_neuron_CD1.K[ , G4_signal:="K+" ]
ESC_derived_neuron_CD1.PDS[ , G4_signal:="PDS" ]
ESC_derived_neuron_CD1.motif_K_PDS <- rbind(ESC_derived_neuron_CD1.motif, ESC_derived_neuron_CD1.K, ESC_derived_neuron_CD1.PDS)
ESC_derived_neuron_CD1.motif_K_PDS$G4_signal <- factor(ESC_derived_neuron_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(ESC_derived_neuron_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.C <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV10_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV10_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
primary_cortical_neuron_DIV10_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV10_CD1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV10_CD1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV10_CD1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV10_CD1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_CD1.motif, primary_cortical_neuron_DIV10_CD1.K, primary_cortical_neuron_DIV10_CD1.PDS)
primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.D <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV10_Tc1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV10_Tc1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K",
45)
primary_cortical_neuron_DIV10_Tc1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV10_Tc1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV10_Tc1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV10_Tc1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_Tc1.motif, primary_cortical_neuron_DIV10_Tc1.K, primary_cortical_neuron_DIV10_Tc1.PDS)
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.B <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV4_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV4_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrect
primary_cortical_neuron_DIV4_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV4_CD1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV4_CD1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV4_CD1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV4_CD1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV4_CD1.motif, primary_cortical_neuron_DIV4_CD1.K, primary_cortical_neuron_DIV4_CD1.PDS)
primary_cortical_neuron_DIV4_CD1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV4_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV4_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

KCL_human[(DeltaPsi<=-0.1 & Probability>0.9), Delta_type:="Included"]
KCL_human[(DeltaPsi>=0.1 & Probability>0.9), Delta_type:="Skiped"]
KCL_human[is.na(Delta_type), Delta_type:="None"]
KCL_human_stats <- KCL_human[Type=="CE" , .(count=.N), by=c("Delta_type", "exon", "G4_bol") ]
KCL_human_stats[, total:=sum(count), by="G4_bol"]
KCL_human_stats[, fraction:=count/total]
Fig5.B <- ggplot() +
geom_bar(data=KCL_human_stats[Delta_type!="None" & exon=="exon", ] , aes(x= G4_bol, y=fraction, group=Delta_type, fill=Delta_type ) , position="dodge", stat="identity" ) +
xlab("") +
ylab("Fraction of differentially inclued exons ") +
theme_bw() +
guides(fill=guide_legend(title="Alternative splicing event")) +
theme(legend.position = "top", legend.direction = "horizontal")
Fig5.B

diff.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.up[, `:=`(type="diff", pos="up" )]
diff.down[, `:=`(type="diff", pos="down" )]
eql.up[, `:=`(type="eql", pos="up" )]
eql.down[, `:=`(type="eql", pos="down" )]
diff_eql <- rbind(diff.up, diff.down, eql.up, eql.down)
ggplot(diff_eql) +
geom_line(aes(x=Position, y=Enrrichment, group=type)) +
facet_grid(pos ~ .) +
theme_bw()

plot_eql_diff <- function(eql_up_plus, eql_up_minus, eql_down_plus, eql_down_minus, diff_up_plus, diff_up_minus, diff_down_plus, diff_down_minus ){
diff.up_plus <- read_dist_table(diff_up_plus)
diff.up_minus <- read_dist_table(diff_up_minus)
diff.down_plus <- read_dist_table(diff_down_plus)
diff.down_minus <- read_dist_table(diff_down_minus)
diff.up_minus[,Position:=Position*-1]
diff.down_minus[,Position:=Position*-1]
diff.TOTAL <- plot_density(diff.up_plus, diff.up_minus, diff.down_plus, diff.down_minus)
eql.up_plus <- read_dist_table(eql_up_plus)
eql.up_minus <- read_dist_table(eql_up_minus)
eql.down_plus <- read_dist_table(eql_down_plus)
eql.down_minus <- read_dist_table(eql_down_minus)
eql.up_minus[,Position:=Position*-1]
eql.down_minus[,Position:=Position*-1]
eql.TOTAL <- plot_density(eql.up_plus, eql.up_minus, eql.down_plus, eql.down_minus)
diff.TOTAL[, type:="diff"]
eql.TOTAL[, type:="eql"]
diff_eql.TOTAL <- rbind(diff.TOTAL, eql.TOTAL)
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=Enrrichment, color=type)) +
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
}
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=Enrrichment, color=type)) +
geom_ribbon(aes(ymin=Enrrichment_l, ymax=Enrrichment_u, x=Position, fill=type), alpha=0.3 )+
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
scale_fill_manual(values=c("#669900", "grey")) +
scale_color_manual(values=c("#669900", "darkgrey"))
Error in FUN(X[[i]], ...) : object 'Enrrichment_l' not found

KCL_human <- fread("../KCL/MicroExonator/Control_vs_KCL.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_human <- KCL_human[, 1:11]
colnames(KCL_human) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
human.CE.NA <- nrow(KCL_human[(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
human.CE.diff <- nrow(KCL_human[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_ESC_derived_neuron_CD1 <- fread("../KCL/MicroExonator/ESC-derived_neuron_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_ESC_derived_neuron_CD1 <- KCL_ESC_derived_neuron_CD1 [, 1:11]
colnames(KCL_ESC_derived_neuron_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
ESC_derived_neuron_CD1.CE.NA <- nrow(KCL_ESC_derived_neuron_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
ESC_derived_neuron_CD1.CE.diff <- nrow(KCL_ESC_derived_neuron_CD1[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV10_Tc1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV10_Tc1 <- KCL_primary_cortical_neuron_DIV10_Tc1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV10_Tc1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV10_Tc1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV10_Tc1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV10_Tc1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV10_Tc1 [abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV4_CD1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV4_CD1 <- KCL_primary_cortical_neuron_DIV4_CD1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV4_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV4_CD1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV4_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV4_CD1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV4_CD1 [abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV10_CD1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV10_CD1 <- KCL_primary_cortical_neuron_DIV10_CD1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV10_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV10_CD1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV10_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV10_CD1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV10_CD1[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05)



G4seq
plot_eql_diff(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num"
)



Fig5.C <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05)


Fig5.c <- Fig5.C +ylim( c(0.4, 2.1))
Fig5.c

Fig5.D <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)


Fig5.D <- Fig5.D +ylim( c(0.4, 2.1))
Fig5.D

sup.mus.ss_enrichment.ESC.K <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05
)







smooth
rep(1:1999, each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12
[48] 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24
[95] 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 35 36
[142] 36 36 36 37 37 37 37 38 38 38 38 39 39 39 39 40 40 40 40 41 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 46 47 47 47 47
[189] 48 48 48 48 49 49 49 49 50 50 50 50 51 51 51 51 52 52 52 52 53 53 53 53 54 54 54 54 55 55 55 55 56 56 56 56 57 57 57 57 58 58 58 58 59 59 59
[236] 59 60 60 60 60 61 61 61 61 62 62 62 62 63 63 63 63 64 64 64 64 65 65 65 65 66 66 66 66 67 67 67 67 68 68 68 68 69 69 69 69 70 70 70 70 71 71
[283] 71 71 72 72 72 72 73 73 73 73 74 74 74 74 75 75 75 75 76 76 76 76 77 77 77 77 78 78 78 78 79 79 79 79 80 80 80 80 81 81 81 81 82 82 82 82 83
[330] 83 83 83 84 84 84 84 85 85 85 85 86 86 86 86 87 87 87 87 88 88 88 88 89 89 89 89 90 90 90 90 91 91 91 91 92 92 92 92 93 93 93 93 94 94 94 94
[377] 95 95 95 95 96 96 96 96 97 97 97 97 98 98 98 98 99 99 99 99 100 100 100 100 101 101 101 101 102 102 102 102 103 103 103 103 104 104 104 104 105 105 105 105 106 106 106
[424] 106 107 107 107 107 108 108 108 108 109 109 109 109 110 110 110 110 111 111 111 111 112 112 112 112 113 113 113 113 114 114 114 114 115 115 115 115 116 116 116 116 117 117 117 117 118 118
[471] 118 118 119 119 119 119 120 120 120 120 121 121 121 121 122 122 122 122 123 123 123 123 124 124 124 124 125 125 125 125 126 126 126 126 127 127 127 127 128 128 128 128 129 129 129 129 130
[518] 130 130 130 131 131 131 131 132 132 132 132 133 133 133 133 134 134 134 134 135 135 135 135 136 136 136 136 137 137 137 137 138 138 138 138 139 139 139 139 140 140 140 140 141 141 141 141
[565] 142 142 142 142 143 143 143 143 144 144 144 144 145 145 145 145 146 146 146 146 147 147 147 147 148 148 148 148 149 149 149 149 150 150 150 150 151 151 151 151 152 152 152 152 153 153 153
[612] 153 154 154 154 154 155 155 155 155 156 156 156 156 157 157 157 157 158 158 158 158 159 159 159 159 160 160 160 160 161 161 161 161 162 162 162 162 163 163 163 163 164 164 164 164 165 165
[659] 165 165 166 166 166 166 167 167 167 167 168 168 168 168 169 169 169 169 170 170 170 170 171 171 171 171 172 172 172 172 173 173 173 173 174 174 174 174 175 175 175 175 176 176 176 176 177
[706] 177 177 177 178 178 178 178 179 179 179 179 180 180 180 180 181 181 181 181 182 182 182 182 183 183 183 183 184 184 184 184 185 185 185 185 186 186 186 186 187 187 187 187 188 188 188 188
[753] 189 189 189 189 190 190 190 190 191 191 191 191 192 192 192 192 193 193 193 193 194 194 194 194 195 195 195 195 196 196 196 196 197 197 197 197 198 198 198 198 199 199 199 199 200 200 200
[800] 200 201 201 201 201 202 202 202 202 203 203 203 203 204 204 204 204 205 205 205 205 206 206 206 206 207 207 207 207 208 208 208 208 209 209 209 209 210 210 210 210 211 211 211 211 212 212
[847] 212 212 213 213 213 213 214 214 214 214 215 215 215 215 216 216 216 216 217 217 217 217 218 218 218 218 219 219 219 219 220 220 220 220 221 221 221 221 222 222 222 222 223 223 223 223 224
[894] 224 224 224 225 225 225 225 226 226 226 226 227 227 227 227 228 228 228 228 229 229 229 229 230 230 230 230 231 231 231 231 232 232 232 232 233 233 233 233 234 234 234 234 235 235 235 235
[941] 236 236 236 236 237 237 237 237 238 238 238 238 239 239 239 239 240 240 240 240 241 241 241 241 242 242 242 242 243 243 243 243 244 244 244 244 245 245 245 245 246 246 246 246 247 247 247
[988] 247 248 248 248 248 249 249 249 249 250 250 250 250
[ reached getOption("max.print") -- omitted 6996 entries ]
diff_eql.TOTAL[ , bin:=rep(1:1999, each=4) ]
diff_eql.TOTAL[, mean_Enrrichment:=mean(Enrrichment) , by=bin]
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=mean_Enrrichment, color=type)) +
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

Intron lenght

ks.test(intron_size[G4>0, intron_size], intron_size[G4==0, intron_size])
p-value will be approximate in the presence of ties
Two-sample Kolmogorov-Smirnov test
data: intron_size[G4 > 0, intron_size] and intron_size[G4 == 0, intron_size]
D = 0.25781, p-value < 2.2e-16
alternative hypothesis: two-sided

intron_size_ints_total[ relative_frac %in% intron_size_ints_total[, max(relative_frac), by=pos]$V1, ]
int factor.x count.x total.x frac.x factor.y count.y total.y frac.y relative_frac pos
1: 70 int_counts_up_w_G4 150 61795 0.002427381 int_counts_up_wo_G4 509 651213 0.0007816183 3.105583 Upstream intron
2: 70 int_counts_down_w_G4 150 42311 0.003545177 int_counts_down_wo_G4 509 670697 0.0007589120 4.671395 Downstream intron
Upstream_U2_score_len <- fread("../Figures/Figure3/Upstream_U2_score_len_matrix.txt2.old")
Downstream_U2_score_len <- fread("../Figures/Figure3/Downstream_U2_score_len_matrix.txt2.old")
Upstream_U2_score_len <-data.table::melt(Upstream_U2_score_len, id.vars='IL')
Downstream_U2_score_len <- data.table::melt(Downstream_U2_score_len, id.vars='IL')
Upstream_U2_score_len[, pos:="Upstream intron"]
Downstream_U2_score_len[, pos:="Downstream intron"]
Fig3.D1 <- ggplot(Upstream_U2_score_len) +
geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
facet_grid(. ~ pos) +
theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
Fig3.D2 <- ggplot(Downstream_U2_score_len) +
geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
facet_grid(. ~ pos) +
theme(legend.position = "bottom", legend.direction = "horizontal") +
theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
Fig3.D <- plot_grid(Fig3.D1, Fig3.D2)
Fig3.D

closest_g4 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ , dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ , dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ , dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ , dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus)
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
exon.up.motif <- fread("../Figures/Figure1/exons.up.closest_G4_clean")
colnames(exon.up.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.up.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.up.motif[ strand=="+" , dist:=gmid - estart]
exon.up.motif[ strand=="-" , dist:= estart - gmid]
exon.down.motif <- fread("../Figures/Figure1/exons.down.closest_G4_clean")
colnames(exon.down.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.down.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.down.motif[ strand=="+" , dist:=gmid - estart]
exon.down.motif[ strand=="-" , dist:= estart - gmid]
exon.up.motif[, pos:="3'Splice site"]
exon.down.motif[, pos:="5'Splice site"]
exon.dist.motif <- rbind(exon.up.motif, exon.down.motif)
ggplot(exon.dist.motif) +
geom_density(aes(dist)) +
xlim(c(-1000, 1000)) +
facet_grid(. ~ pos)

NA
closest_g4_KCL <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
Error in closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed", :
could not find function "closest_g4"
#closest_g4_KCL_PDS_motif
closest_g4_KCL_PDS_motif.1kb <- closest_g4_KCL_PDS_motif[abs(dist)<=1000 , ]
closest_g4_KCL_PDS_motif.1kb[, bin:=cut(dist, seq(-1000, 1000, 5), labels= seq(-995, 1000, 5), include.lowest=TRUE ) ]
closest_g4_KCL_PDS_motif.1kb.enrichment <- closest_g4_KCL_PDS_motif.1kb[ , .(Occurrences=.N) , by=c("dist", "pos", "Type")]
closest_g4_KCL_PDS_motif.1kb.enrichment.median <- closest_g4_KCL_PDS_motif.1kb.enrichment[, .(median=median(Occurrences)), by=c( "pos", "Type") ]
closest_g4_KCL_PDS_motif.1kb.enrichment <- merge(closest_g4_KCL_PDS_motif.1kb.enrichment, closest_g4_KCL_PDS_motif.1kb.enrichment.median, by=c( "pos", "Type"))
closest_g4_KCL_PDS_motif.1kb.enrichment[, Enrrichment:=Occurrences/median]
closest_g4_KCL_PDS_motif.1kb.enrichment[Type=="Consensus G4 motif", Type:="G4 motif" ]
#closest_g4_KCL_PDS_motif.1kb.enrichment[ , bin:=as.numeric(as.character(bin))]
ggplot(closest_g4_KCL_PDS_motif.1kb.enrichment) +
geom_line(aes(dist, Enrrichment, colour=Type)) +
xlim(c(-1000, 1000)) +
facet_grid(Type ~ pos) +
xlab("Distance") +
ylab("Enrichment") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text( angle = 45))
closest_g4_2015 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ , dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ , dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ , dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ , dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus)
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
closest_g4_KCL_2015 <- closest_g4_2015("../Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
closest_g4_PDS_2015 <- closest_g4_2015("../Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed")
closest_g4_KCL_2015[, Type:="G4-seq Na+ K+"]
closest_g4_PDS_2015[, Type:="G4-seq Na+ PDS"]
closest_g4_KCL_2015 <- unique(closest_g4_KCL_2015[ , c("echrom", "estart", "eend", "dist", "pos", "Type")])
closest_g4_PDS_2015 <- unique(closest_g4_PDS_2015[ , c("echrom", "estart", "eend", "dist", "pos", "Type")])
closest_g4_KCL_PDS_2015 <- rbind(closest_g4_KCL_2015, closest_g4_PDS_2015)
ggplot(closest_g4_KCL_PDS_2015) +
geom_line(aes(dist, colour=Type), bw=10, stat="density") +
xlim(c(-1000, 1000)) +
facet_grid(Type ~ pos) +
xlab("Distance") +
ylab("Density") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text( angle = 45))
closest_g4_KCL.sacCer3 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.sacCer3 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.tair10 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.tair10 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.danRer10 <- closest_g4("../Figures/Figure1/exon_up_plus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.danRer10 <- closest_g4("../Figures/Figure1/exon_up_plus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.dm6 <- closest_g4("../Figures/Figure1/exon_up_plus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.dm6 <- closest_g4("../Figures/Figure1/exon_up_plus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.mm10 <- closest_g4("../Figures/Figure1/exon_up_plus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.mm10 <- closest_g4("../Figures/Figure1/exon_up_plus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.hg19 <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.hg19 <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.ce10 <- closest_g4("../Figures/Figure1/exon_up_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.ce10 <- closest_g4("../Figures/Figure1/exon_up_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.sacCer3[, `:=`(Treatment="KCl", Species="S. cerevisiae") ]
closest_g4_PDS.sacCer3[, `:=`(Treatment="PDS", Species="S. cerevisiae") ]
closest_g4_KCL.tair10[, `:=`(Treatment="KCl", Species="A. thaliana" ) ]
closest_g4_PDS.tair10[, `:=`(Treatment="PDS", Species="A. thaliana" ) ]
closest_g4_KCL.danRer10[, `:=`(Treatment="KCl", Species="D. rerio" ) ]
closest_g4_PDS.danRer10[, `:=`(Treatment="PDS", Species="D. rerio" ) ]
closest_g4_KCL.dm6[, `:=`(Treatment="KCl", Species= "D. melanogaster" ) ]
closest_g4_PDS.dm6[, `:=`(Treatment="PDS", Species= "D. melanogaster" ) ]
closest_g4_KCL.mm10[, `:=`(Treatment="KCl", Species="M. musculus" ) ]
closest_g4_PDS.mm10[, `:=`(Treatment="PDS", Species="M. musculus" ) ]
closest_g4_KCL.hg19[, `:=`(Treatment="KCl", Species="H. sapiens" ) ]
closest_g4_PDS.hg19[, `:=`(Treatment="PDS", Species="H. sapiens" ) ]
closest_g4_KCL.ce10[, `:=`(Treatment="KCl", Species="C. elegans" ) ]
closest_g4_PDS.ce10[, `:=`(Treatment="PDS", Species="C. elegans" ) ]
closest_g4.TOTAL <- rbind(closest_g4_KCL.sacCer3,
closest_g4_PDS.sacCer3,
closest_g4_KCL.tair10,
closest_g4_PDS.tair10,
closest_g4_KCL.danRer10,
closest_g4_PDS.danRer10,
closest_g4_KCL.dm6,
closest_g4_PDS.dm6,
closest_g4_KCL.mm10,
closest_g4_PDS.mm10,
closest_g4_KCL.hg19,
closest_g4_PDS.hg19,
closest_g4_KCL.hg19,
closest_g4_PDS.hg19)
ggplot(closest_g4.TOTAL) +
geom_line(aes(dist, colour=Species), bw=10, stat="density") +
xlim(c(-1000, 1000)) +
facet_grid(Treatment ~ pos) +
xlab("Distance") +
ylab("Density") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
closest_g4.TOTAL.1kb <- closest_g4.TOTAL[abs(dist)<=1000 , ]
Error: object 'closest_g4.TOTAL' not found
read_dist_table_plus_minus <- function(path.plus, path.minus ){
dist_table.plus <- data.table(read_delim(path.plus,
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE))
dist_table.plus <- dist_table.plus[, 2:2001]
dist_table.plus <- data.table(as.data.frame(t(dist_table.plus)))
colnames(dist_table.plus) <- c("Position", "Occurrences")
dist_table.minus <- data.table(read_delim(path.minus,
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE))
dist_table.minus <- dist_table.minus[, 2:2001]
dist_table.minus <- data.table(as.data.frame(t(dist_table.minus)))
colnames(dist_table.minus) <- c("Position", "Occurrences")
dist_table <- merge(dist_table.plus, dist_table.minus, by="Position")
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table <- dist_table[, c("Position", "Occurrences")]
dist_table[,median:=median(Occurrences)]
dist_table[, Enrrichment:=Occurrences/median]
dist_table[, Position:=Position-1]
return(dist_table)
}
enrichment_G4_seq_plot <- function(path.up_plus.plus, path.up_plus.minus,
path.down_plus.plus, path.down_plus.minus,
path.up_minus.plus, path.up_minus.minus,
path.down_minus.plus, path.down_minus.minus ){
x.up_plus <- read_dist_table_plus_minus(path.up_plus.plus,
path.up_plus.minus)
x.down_plus <- read_dist_table_plus_minus(path.down_plus.plus,
path.down_plus.minus)
x.up_minus <- read_dist_table_plus_minus(path.up_minus.plus,
path.up_minus.minus)
x.down_minus <- read_dist_table_plus_minus(path.down_minus.plus,
path.down_minus.minus)
x.up_minus[,Position:=Position*-1]
x.down_minus[,Position:=Position*-1]
x.TOTAL <- plot_density(x.up_plus, x.up_minus, x.down_plus, x.down_minus)
return(x.TOTAL)
}
hg19.TOTAL.KCL <- enrichment_G4_seq_plot("./G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Error in read_dist_table_plus_minus(path.up_plus.plus, path.up_plus.minus) :
could not find function "read_dist_table_plus_minus"
hg19.TOTAL.KCL[, Treatment:="KCl"]
hg19.TOTAL.PDS[, Treatment:="PDS"]
hg19.TOTAL.KCL[, Species:="H. sapiens"]
hg19.TOTAL.PDS[, Species:="H. sapiens"]
sacCer3.TOTAL.KCL[, Treatment:="KCl"]
sacCer3.TOTAL.PDS[, Treatment:="PDS"]
sacCer3.TOTAL.KCL[, Species:="S. cerevisiae"]
sacCer3.TOTAL.PDS[, Species:="S. cerevisiae"]
mouse.TOTAL.KCL[, Treatment:="KCl"]
mouse.TOTAL.PDS[, Treatment:="PDS"]
mouse.TOTAL.KCL[, Species:="M. musculus"]
mouse.TOTAL.PDS[, Species:="M. musculus"]
dm6.TOTAL.KCL[, Treatment:="KCl"]
dm6.TOTAL.PDS[, Treatment:="PDS"]
dm6.TOTAL.KCL[, Species:="D. melanogaster"]
dm6.TOTAL.PDS[, Species:="D. melanogaster"]
tair10.TOTAL.KCL[, Treatment:="KCl"]
tair10.TOTAL.PDS[, Treatment:="PDS"]
tair10.TOTAL.KCL[, Species:="A. thaliana"]
tair10.TOTAL.PDS[, Species:="A. thaliana"]
danRer10.TOTAL.KCL[, Treatment:="KCl"]
danRer10.TOTAL.PDS[, Treatment:="PDS"]
danRer10.TOTAL.KCL[, Species:="D. rerio"]
danRer10.TOTAL.PDS[, Species:="D. rerio"]
TOTAL.KCL_PDS <- rbind(hg19.TOTAL.KCL, hg19.TOTAL.PDS, sacCer3.TOTAL.KCL, sacCer3.TOTAL.PDS, mouse.TOTAL.KCL, mouse.TOTAL.PDS, dm6.TOTAL.KCL, dm6.TOTAL.PDS, tair10.TOTAL.KCL, tair10.TOTAL.PDS, danRer10.TOTAL.KCL, danRer10.TOTAL.PDS)
ggplot(TOTAL.KCL_PDS) +
geom_line(aes(Position, Enrrichment, colour=Species)) +
xlim(c(-1000, 1000)) +
facet_grid(Treatment ~ exon_pos) +
xlab("Distance") +
ylab("Enrichment") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
closest_g4_KCL.hg19.2015 <- closest_g4("../Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
Error in closest_g4("../Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed", :
could not find function "closest_g4"
KCL_up <- unique(closest_g4_KCL[abs(dist)>=100 & pos=="3'Splice site", paste(echrom, estart, eend, sep = "_")])
gg_color_hue <- function(n) {
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(3)
[1] "#F8766D" "#00BA38" "#619CFF"
library(eulerr)
package ‘eulerr’ was built under R version 3.5.2
VennDiag.up_2015 <- euler(c("Motif" = 18132,
"K" = 34761,
"PDS" = 50894,
"K&PDS" = 31711,
"PDS&Motif" = 14786,
"K&Motif" = 11794,
"K&PDS&Motif" = 11250))
venn_supp.up <- plot(VennDiag.up_2015, counts = TRUE, font=2, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
VennDiag.down_2015 <- euler(c("Motif" = 19649,
"K" = 33908,
"PDS" = 49806,
"K&PDS" = 30920,
"PDS&Motif" = 15951,
"K&Motif" = 12615,
"K&PDS&Motif" = 12027))
venn_supp.down <- plot(VennDiag.down_2015, counts = TRUE, font=1, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
plot_grid(venn_supp.up, venn_supp.down, labels = c("3' Splice site", "5' Splice site"))

dataframe_G4_consensus_motif_enrichment_species <- fread("../Figures/Figure1/dataframe_G4_consensus_motif_enrichment_species")
dataframe_G4_consensus_motif_enrichment_species_matrix <- t(dataframe_G4_consensus_motif_enrichment_species)
header <- as.character(head(dataframe_G4_consensus_motif_enrichment_species_matrix, 1))
dataframe_G4_consensus_motif_enrichment_species_df <- as.data.frame(tail(dataframe_G4_consensus_motif_enrichment_species_matrix, -1))
colnames(dataframe_G4_consensus_motif_enrichment_species_df) <- header
dataframe_G4_consensus_motif_enrichment_species_df$specie <- rownames(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt <- data.table(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt$median <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$median))
dataframe_G4_consensus_motif_enrichment_species_dt$st.dev <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$st.dev))
dataframe_G4_consensus_motif_enrichment_species_dt$specie <- factor(dataframe_G4_consensus_motif_enrichment_species_dt$specie , levels=dataframe_G4_consensus_motif_enrichment_species_dt[order(-median)]$specie)
Fig6.A <- ggplot(dataframe_G4_consensus_motif_enrichment_species_dt, aes(x = specie, y=median) ) +
geom_bar( stat="identity", colour="black", fill="white") +
geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="red" , width=0.2) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
Fig6.A
dataframe_evo_PDS_K <- fread("../Figures/Figure1/dataframe_evo_PDS_K")
dataframe_evo_PDS_K_matrix <- t(dataframe_evo_PDS_K)
header <- as.character(head(dataframe_evo_PDS_K_matrix, 1))
dataframe_evo_PDS_K_df <- as.data.frame(tail(dataframe_evo_PDS_K_matrix, -1))
colnames(dataframe_evo_PDS_K_df) <- header
dataframe_evo_PDS_K_df$Species <- rownames(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt <- data.table(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt_nice <- rbind(dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="K+", median=K_median, st.dev=K_st.dev ) ],
dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="PDS", median=PDS_median, st.dev=PDS_st.dev ) ])
dataframe_evo_PDS_K_dt_nice$median <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$median))
dataframe_evo_PDS_K_dt_nice$st.dev <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$st.dev))
ggplot(dataframe_evo_PDS_K_dt_nice, aes(x = Species, y=median, group=Treatment)) +
geom_bar( aes(colour=Treatment ), stat="identity", fill="white", position="dodge") +
geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="black" , width=0.2, position = position_dodge()) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
dataframe_evo_PDS_K_dt_nice$Species <- factor(dataframe_evo_PDS_K_dt_nice$Species , levels=dataframe_evo_PDS_K_dt_nice[Treatment=="PDS"][order(-median)]$Species)
Fig6.C <- ggplot(dataframe_evo_PDS_K_dt_nice, aes(x=Species, weight=median, ymin=median-st.dev, ymax=median+st.dev, group=Treatment)) +
geom_bar(position=position_dodge(), aes(y=median, color=Treatment), fill="white", stat="identity") +
geom_errorbar (position=position_dodge(width=0.9), colour="black", width=0.2) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
Fig6.C
dataframe_evo_PDS_K_dt_nice
Figures
Fig1.BC <- plot_grid(Fig1.B, Fig1.C, ncol=1, labels = c("B", "C"), rel_heights = c(2, 1))
Error in plot_grid(Fig1.B, Fig1.C, ncol = 1, labels = c("B", "C"), rel_heights = c(2, :
object 'Fig1.B' not found
Fig2 <- plot_grid(Fig2.A, Fig2.B,ncol = 1 , labels ="AUTO", rel_heights = c(1.5, 1))
Fig2


Fig5.bottom <- plot_grid(Fig5.A, Fig5.B, Fig5.C, Fig5.D, nrow = 2, ncol = 2 , labels = c("B", "C", "D", "E"), rel_heights = c(1, 1, 1, 1))
Removed 2996 rows containing missing values (geom_path).Removed 2996 rows containing missing values (geom_path).
Fig5 <- plot_grid(Fig5.A1, Fig5.bottom, nrow=2, labels = c("A", ""), rel_heights = c(2, 4))
Fig5

Fig6.top <- plot_grid(Fig6.A, Fig6.C, labels = c("A", "C"))
Fig6.bottom <- plot_grid(Fig6.B, Fig6.D, labels = c("B", "D"))
Fig6 <- plot_grid(Fig6.A, Fig6.C, Fig6.B , Fig6.D, labels = c("A", "C", "B", "D") , ncol=2, rel_heights = c(1, 1, 3, 3))
Fig6 <- plot_grid(Fig6.top, Fig6.bottom, rel_heights = c(1, 1.5), nrow=2)
Fig6
LS0tCnRpdGxlOiAiR2Vvcmdha29wb3Vsb3VzLXNvYXJlcyBhbmQgUGFyYWRhIGV0LiBhbCAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgoKCgojIE5vbi1CIEROQSBzdHJ1Y3R1cmVzIGFjcm9zcyBzcGxpY2Utc2l0ZXMKCgpUbyBpbnZlc3RpZ2F0ZSBpZiBub24tQiBETkEgc3RydWN0dXJlcyBjYW4gYWZmZWN0IHNwbGljaW5nLCB3ZSBleHBsb3JlIHRoZSBkaXN0cmlidXRpb24gb2YgZGlmZmVyZW50IG1vdGlmcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggTm9uLUIgRE5BIHN0cnVjdHVyZXMuIFdlIGNhbGN1bGF0ZWQgdGhlIG51bWJlciBvZiB0aGVzZSBtb3RpZnMgdGhhdCBjYW4gYmUgZm91bmQgYWNyb3NzIHNwbGljZSBzaXRlcyAoLm51bSBmaWxlcykgYW5kIHRoZW4gd2UgY2FsY3VsYXRlZCB0aGUgcG9zaXRpb25hbCBlbnJpY2htZW50IG9mIHRoZXNlIGFjcm9zcyBzcGxpY2Ugc2l0ZXMuIAoKCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGx5cikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KEhtaXNjKQoKCmBgYAoKCk9uIHRoaXMgcmVwb3J0IHdlIGNvbXBpbGUgYWxsIHRoZSBkYXRhIGFuYWx5c2lzIHRoYXQgbGVhZCB1cyB0byBnZXQgdGhlIGZpbmFsIGZpZ3VyZXMuIEZvciB0aGlzLCB3ZSBwcm9jZXNzZWQgc2V2ZXJhbCAgYQoKYGBge3J9CgoKCnJlYWRfZGlzdF90YWJsZSA8LSBmdW5jdGlvbihwYXRoKXsKICAKZGlzdF90YWJsZSA8LSBkYXRhLnRhYmxlKHJlYWRfZGVsaW0ocGF0aCwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgIHRyaW1fd3MgPSBUUlVFKSkKCmRpc3RfdGFibGUgPC0gZGlzdF90YWJsZVssIDI6MjAwMV0KZGlzdF90YWJsZSA8LSBkYXRhLnRhYmxlKGFzLmRhdGEuZnJhbWUodChkaXN0X3RhYmxlKSkpCmNvbG5hbWVzKGRpc3RfdGFibGUpIDwtIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIikKCmRpc3RfdGFibGVbLG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKV0KZGlzdF90YWJsZVssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCmRpc3RfdGFibGVbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0KCnJldHVybihkaXN0X3RhYmxlKSAgCn0KCgpgYGAKCgoKCmBgYHtyfQoKcGxvdF9kZW5zaXR5IDwtIGZ1bmN0aW9uKHVwX3BsdXMsIHVwX21pbnVzLCBkb3duX3BsdXMsIGRvd25fbWludXMpewoKICAKICB1cF9UT1RBTCA8LSAgbWVyZ2UodXBfcGx1cywgdXBfbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgdXBfVE9UQUxbLE9jY3VycmVuY2VzOj1PY2N1cnJlbmNlcy54K09jY3VycmVuY2VzLnldCiAgdXBfVE9UQUxbLG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKV0KICB1cF9UT1RBTFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCiAgdXBfVE9UQUxbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0KICAKICAKICBkb3duX1RPVEFMIDwtICBtZXJnZShkb3duX3BsdXMsIGRvd25fbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgZG93bl9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICBkb3duX1RPVEFMWyxtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcyldCiAgZG93bl9UT1RBTFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCiAgZG93bl9UT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQogIAogIHVwX1RPVEFMWyAsZXhvbl9wb3M6PSJVcHN0cmVhbSJdCiAgZG93bl9UT1RBTFsgLGV4b25fcG9zOj0iRG93bnN0cmVhbSJdCiAgCiAgVE9UQUwgPC0gcmJpbmQodXBfVE9UQUwsIGRvd25fVE9UQUwpCiAgCiAgVE9UQUwkZXhvbl9wb3MgPC0gIGZhY3RvcihUT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoIlVwc3RyZWFtIiwgIkRvd25zdHJlYW0iICkpIAogIAogIHAgPC0gZ2dwbG90KFRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgdGhlbWVfYncoKQogIAogIHNob3cocCkKICAKICBUT1RBTAogIAogIAoKfQpgYGAKCgoKYGBge3J9CgoKcGxvdF9kZW5zaXR5X2Jpbm9taWFsIDwtIGZ1bmN0aW9uKHVwX3BsdXMsIHVwX21pbnVzLCBkb3duX3BsdXMsIGRvd25fbWludXMsIG9ic2VydmF0aW9ucywgc2lnKXsKCiAgCiAgdXBfVE9UQUwgPC0gIG1lcmdlKHVwX3BsdXMsIHVwX21pbnVzLCBieT0iUG9zaXRpb24iKQogIHVwX1RPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQogIHVwX1RPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQogIAoKICAKICAKICB1cF9UT1RBTCA8LSBjYmluZCh1cF9UT1RBTCwgdXBfVE9UQUxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBvYnNlcnZhdGlvbnMsIGFscGhhPXNpZykgXSkKCiAgdXBfVE9UQUxbLG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KV0KICB1cF9UT1RBTFssIEVucnJpY2htZW50Oj1Qb2ludEVzdC9tZWRpYW5dCiAgdXBfVE9UQUxbLCBFbnJyaWNobWVudF9sOj1Mb3dlci9tZWRpYW5dCiAgdXBfVE9UQUxbLCBFbnJyaWNobWVudF91Oj1VcHBlci9tZWRpYW5dCiAgdXBfVE9UQUxbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0KCiAgCiAgCiAgZG93bl9UT1RBTCA8LSAgbWVyZ2UoZG93bl9wbHVzLCBkb3duX21pbnVzLCBieT0iUG9zaXRpb24iKQogIGRvd25fVE9UQUxbLE9jY3VycmVuY2VzOj1PY2N1cnJlbmNlcy54K09jY3VycmVuY2VzLnldCgogIAogIGRvd25fVE9UQUwgPC0gY2JpbmQoZG93bl9UT1RBTCwgZG93bl9UT1RBTFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIG9ic2VydmF0aW9ucywgYWxwaGE9c2lnKSBdKQoKICBkb3duX1RPVEFMWyxtZWRpYW46PW1lZGlhbihQb2ludEVzdCldCiAgZG93bl9UT1RBTFssIEVucnJpY2htZW50Oj1Qb2ludEVzdC9tZWRpYW5dCiAgZG93bl9UT1RBTFssIEVucnJpY2htZW50X2w6PUxvd2VyL21lZGlhbl0KICBkb3duX1RPVEFMWywgRW5ycmljaG1lbnRfdTo9VXBwZXIvbWVkaWFuXQogIGRvd25fVE9UQUxbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0gIAogIAogIAogIHVwX1RPVEFMWyAsZXhvbl9wb3M6PSJVcHN0cmVhbSJdCiAgZG93bl9UT1RBTFsgLGV4b25fcG9zOj0iRG93bnN0cmVhbSJdCiAgCiAgVE9UQUwgPC0gcmJpbmQodXBfVE9UQUwsIGRvd25fVE9UQUwpCiAgCiAgVE9UQUwkZXhvbl9wb3MgPC0gIGZhY3RvcihUT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoIlVwc3RyZWFtIiwgIkRvd25zdHJlYW0iICkpIAogIAogIHAgPC0gZ2dwbG90KFRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91LCB4PVBvc2l0aW9uKSwgYWxwaGE9MC4zICkrCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB0aGVtZV9idygpCiAgCiAgI3Nob3cocCkKICAKICByZXR1cm4oVE9UQUwpIAogIAp9CmBgYAoKCgojIyBHLVF1YWRydXBsZXhlcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKRzQudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9HNC5leG9uLnVwX3BsdXMubGlzdC5vdXQubnVtIikKRzQuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0c0LmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCkc0LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0c0LmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKRzQuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9HNC5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKRzQudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KRzQuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKRzQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KEc0LnVwX3BsdXMsIEc0LnVwX21pbnVzLCBHNC5kb3duX3BsdXMsIEc0LmRvd25fbWludXMpIAoKYGBgCgoKIyMgRGlyZWN0ZWQgcmVwZWF0cwoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkRSLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRFIuZXhvbi51cF9wbHVzLmxpc3Qub3V0Lm51bSIpCkRSLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9EUi5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpEUi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9EUi5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCkRSLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRFIuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkRSLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCkRSLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpEUi5UT1RBTCA8LSBwbG90X2RlbnNpdHkoRFIudXBfcGx1cywgRFIudXBfbWludXMsIERSLmRvd25fcGx1cywgRFIuZG93bl9taW51cykKCmBgYAoKCiMjIEgtRE5BCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKSF9ETkEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9IX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSF9ETkEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0hfRE5BLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0hfRE5BLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKSF9ETkEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9IX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSF9ETkEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KSF9ETkEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCkhfRE5BLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShIX0ROQS51cF9wbHVzLCBIX0ROQS51cF9taW51cywgSF9ETkEuZG93bl9wbHVzLCBIX0ROQS5kb3duX21pbnVzKQoKYGBgCgoKIyMgSW52ZXJ0ZWQgcmVwZWF0CgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKSVIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9JUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSVIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0lSLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCklSLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0lSLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKSVIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9JUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSVIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KSVIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCklSLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShJUi51cF9wbHVzLCBJUi51cF9taW51cywgSVIuZG93bl9wbHVzLCBJUi5kb3duX21pbnVzKQoKYGBgCgoKIyMgTWlycm9yIHJlcGVhdAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKTVIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9NUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKTVIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL01SLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCk1SLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL01SLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKTVIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9NUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKTVIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KTVIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCk1SLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShNUi51cF9wbHVzLCBNUi51cF9taW51cywgTVIuZG93bl9wbHVzLCBNUi5kb3duX21pbnVzKQoKYGBgCgoKIyMgU2hvcnQgdGFuZGVtIHJlcGVhdAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKU1RSLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvU1RSLmV4b24uZG93bl9taW51cy5saXN0Lm91dC5udW0iKQpTVFIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1NUUi5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpTVFIudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvU1RSLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKU1RSLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvU1RSLmV4b24uZG93bl9taW51cy5saXN0Lm91dC5udW0iKQpTVFIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KU1RSLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpTVFIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KFNUUi51cF9wbHVzLCBTVFIudXBfbWludXMsIFNUUi5kb3duX3BsdXMsIFNUUi5kb3duX21pbnVzKQoKYGBgCgoKCiMjIFotRE5BCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKWl9ETkEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9aX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1pfRE5BLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpClpfRE5BLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1pfRE5BLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9aX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KWl9ETkEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKClpfRE5BLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShaX0ROQS51cF9wbHVzLCBaX0ROQS51cF9taW51cywgWl9ETkEuZG93bl9wbHVzLCBaX0ROQS5kb3duX21pbnVzKQoKYGBgCgoKIyMgQWxsIE5vbi1CIEROQSBtb3RpZnMgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTV9Ckc0LlRPVEFMWywgTm9uX0I6PSJHNCJdCkRSLlRPVEFMWywgTm9uX0I6PSJEUiJdCkhfRE5BLlRPVEFMWywgTm9uX0I6PSJIIEROQSJdCklSLlRPVEFMWywgTm9uX0I6PSJJUiJdCk1SLlRPVEFMWywgTm9uX0I6PSJNUiJdClNUUi5UT1RBTFssIE5vbl9COj0iU1RSIl0KWl9ETkEuVE9UQUxbLCBOb25fQjo9IlogRE5BIl0KCk5vbl9CLlRPVEFMIDwtIHJiaW5kKEc0LlRPVEFMLCBEUi5UT1RBTCwgSF9ETkEuVE9UQUwsIElSLlRPVEFMLCBNUi5UT1RBTCwgU1RSLlRPVEFMLCBaX0ROQS5UT1RBTCkKCkZpZzEuQSA8LSBnZ3Bsb3QoTm9uX0IuVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCBOb25fQiB+IGV4b25fcG9zICkgKwogIHRoZW1lX2J3KCkKCkZpZzEuQQoKYGBgCgoKCgpgYGB7cn0KCk5vbl9CLlRPVEFMLkVucnJpY2htZW50X1BlYWsgPC0gTm9uX0IuVE9UQUxbICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnkgPSBjKCJOb25fQiIsICJleG9uX3BvcyIgKV0KCgoKd3JpdGUudGFibGUoTm9uX0IuVE9UQUwuRW5ycmljaG1lbnRfUGVhaywgZmlsZSA9ICIuL1RhYmxlcy9Ob25fQi5UT1RBTC5FbnJyaWNobWVudF9QZWFrLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLAogICAgICAgICAgICBlb2wgPSAiXG4iLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgIGNvbC5uYW1lcyA9IFRSVUUsIHFtZXRob2QgPSBjKCJlc2NhcGUiLCAiZG91YmxlIiksCiAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICIiKQoKYGBgCgoKIyBEaXN0cmlidXRpb24gb2Ygbm9uLUIgRE5BIG1vdGlmcyBhY3Jvc3Mgd2VhayBhbmQgc3Ryb25nIHNwbGljZSBzaXRlcwoKCldlIGNhbGN1bGF0ZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBub24tQiBETkEgbW90aWZzIGFjcm9zcyBxdWFydGlsZXMgb2Ygc3BsaWNlIHN0cmVuZ3RoLCB3aGVyZSBRMSBhcmUgdGhlIHdlYWtlc3Qgc3BsaWNlIHNpdGVzIGFuZCBRNCBhcmUgdGhlIHN0cm9uZ2VzdC4gIAoKCmBgYHtyfQoKTWVyZ2VfUXMgPC0gZnVuY3Rpb24oUXMubGlzdCwgd2luZG93X2xlbiwgc3RyYW5kICkgewogIAogIFRvdGFsX1FzIDwtIGRhdGEudGFibGUocmJpbmRsaXN0KFFzLmxpc3QpKQogIFFfbmFtZXMgPC0gc2VxKG5yb3coVG90YWxfUXMpL3dpbmRvd19sZW4pCiAgVG90YWxfUXNbLCBROj1yZXAoUV9uYW1lcywgZWFjaD13aW5kb3dfbGVuKV0KICAKICBpZihzdHJhbmQ9PSItIil7CiAgICAKICAgIFRvdGFsX1FzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCiAgfQogIAogIFRvdGFsX1FzCn0KCgpgYGAKCgpgYGB7cn0KbWVyZ2VfcGx1c19taW51cyA8LSBmdW5jdGlvbihwbHVzLCBtaW51cyl7CgogIFRPVEFMIDwtIG1lcmdlKHBsdXMsIG1pbnVzLCBieT1jKCJQb3NpdGlvbiIsICJRIikgKQogIFRPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQogIFRPVEFMWyxtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcyksICBieT1jKCJRIildCiAgVE9UQUxbLCBFbnJyaWNobWVudDo9T2NjdXJyZW5jZXMvbWVkaWFuXQogIFRPVEFMWywgUG9zaXRpb246PVBvc2l0aW9uLTFdCiAgCn0KYGBgCgoKYGBge3J9Ck1lcmdlX3VwX2Rvd24gPC0gZnVuY3Rpb24oUXMudXAsIFFzLmRvd24pewoKICBRcy50b3RhbCA8LSByYmluZChRcy51cCwgUXMuZG93bikKICAKICBoYWxmX24gPC0gbnJvdyhRcy50b3RhbCkvMgogIFFzLnRvdGFsWywgZXhvbl9wb3M6PXJlcChjKCJVcHN0cmVhbSIsICJEb3duc3RyZWFtIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgUXMudG90YWwkZXhvbl9wb3MgPC0gIGZhY3RvcihRcy50b3RhbCRleG9uX3BvcywgbGV2ZWxzPWMoIlVwc3RyZWFtIiwgIkRvd25zdHJlYW0iICkpCiAgUXMudG90YWwkUSA8LSAgZmFjdG9yKFFzLnRvdGFsJFEpCiAgCiAgUXMudG90YWwKICAKfQpgYGAKCgoKYGBge3J9CgoKZ2V0X3RvdGFsX1FzIDwtIGZ1bmN0aW9uKFFzLnBsdXMudXAubGlzdCwgUXMubWludXMubGlzdCwgUXMucGx1cy5kb3duLmxpc3QsIFFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbil7CgogIFFzLnBsdXMudXAgPC0gTWVyZ2VfUXMoUXMucGx1cy51cC5saXN0LCB3aW5kb3dfbGVuLCBzdHJhbmQ9IisiKQogIFFzLm1pbnVzLnVwIDwtIE1lcmdlX1FzKFFzLm1pbnVzLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZD0iLSIpCiAgUXMudXAgPC0gbWVyZ2VfcGx1c19taW51cyhRcy5wbHVzLnVwLCBRcy5taW51cy51cCkKICAKICBRcy5wbHVzLmRvd24gPC0gTWVyZ2VfUXMoUXMucGx1cy5kb3duLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZD0iKyIpCiAgUXMubWludXMuZG93bjwtIE1lcmdlX1FzKFFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbiwgc3RyYW5kPSItIikKICBRcy5kb3duIDwtIG1lcmdlX3BsdXNfbWludXMoUXMucGx1cy5kb3duLCBRcy5taW51cy5kb3duKQogIAogIFFzLnRvdGFsIDwtIE1lcmdlX3VwX2Rvd24oUXMudXAsIFFzLmRvd24pCiAgCiAgUXMudG90YWwKICAKfQogIApgYGAKCgoKYGBge3J9CgoKRzQuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMy5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCgpHNC5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMi5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCgpHNC5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnExLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnE0LmJlZC5HNC5saXN0Lm91dC5udW0iKQoKRzQuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMy5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5HNC5saXN0Lm91dC5udW0iKQoKRzQuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzQuUTFfdXBfcGx1cywgRzQuUTJfdXBfcGx1cywgRzQuUTNfdXBfcGx1cywgRzQuUTRfdXBfcGx1cykKRzQuUXMubWludXMubGlzdCA8LSBsaXN0KEc0LlExX3VwX21pbnVzLCBHNC5RMl91cF9taW51cywgRzQuUTNfdXBfbWludXMsIEc0LlE0X3VwX21pbnVzKQpHNC5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0LlExX2Rvd25fcGx1cywgRzQuUTJfZG93bl9wbHVzLCBHNC5RM19kb3duX3BsdXMsIEc0LlE0X2Rvd25fcGx1cykKRzQuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzQuUTFfZG93bl9taW51cywgRzQuUTJfZG93bl9taW51cywgRzQuUTNfZG93bl9taW51cywgRzQuUTRfZG93bl9taW51cykKRzQud2luZG93X2xlbiA9IDIwMDAKCkc0LlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNC5Rcy5wbHVzLnVwLmxpc3QsIEc0LlFzLm1pbnVzLmxpc3QsIEc0LlFzLnBsdXMuZG93bi5saXN0LCBHNC5Rcy5taW51cy5kb3duLmxpc3QsIEc0LndpbmRvd19sZW4pCgpHNC5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNC5Rcy50b3RhbCRRLCAgZnJvbSA9YygxOjQpLCB0byA9YygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiKSkKCmdncGxvdChHNC5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkrbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpgYGAKCgpXZSBjYWxjdWxhdGVkIHRoZSBiaW5vbWlhbCBjb25maWRlbmNlIGludGVydmFscyBnaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGV4b24gaW4gZWFjaCBxdWFydGlsZQoKCmBgYHtyfQoKaGcxOS5uZXhvbnMgPC0gMTIzNDMzICsgMTIzOTM2ICAjTnVtYmVyIG9mIGV4b25zIGZvdW5kIGluIGVhY2ggc2lkZQoKRzQuUXMudG90YWwuYmlub21pYWwgPC0gY2JpbmQoRzQuUXMudG90YWwsICBHNC5Rcy50b3RhbFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIGhnMTkubmV4b25zLzQpIF0pCkc0LlFzLnRvdGFsLmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAiUSIpXQpHNC5Rcy50b3RhbC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCmdncGxvdChHNC5Rcy50b3RhbC5iaW5vbWlhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIGdlb21fcmliYm9uKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGZpbGw9USwgeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UpLCBhbHBoYT0wLjMpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpK2xhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCmBgYAoKClRoZW4gd2UgZXhwbG9yZWQgdGhlIGVucmljaG1lbnQgaW4gb3RoZXIgbm9uLUIgRE5BIG1vdGlmcwoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpEUi5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCgpEUi5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLkRScy5saXN0Lm91dC5udW0iKQoKRFIuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCgpEUi5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCgpEUi5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChEUi5RMV91cF9wbHVzLCBEUi5RMl91cF9wbHVzLCBEUi5RM191cF9wbHVzLCBEUi5RNF91cF9wbHVzKQpEUi5Rcy5taW51cy5saXN0IDwtIGxpc3QoRFIuUTFfdXBfbWludXMsIERSLlEyX3VwX21pbnVzLCBEUi5RM191cF9taW51cywgRFIuUTRfdXBfbWludXMpCkRSLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRFIuUTFfZG93bl9wbHVzLCBEUi5RMl9kb3duX3BsdXMsIERSLlEzX2Rvd25fcGx1cywgRFIuUTRfZG93bl9wbHVzKQpEUi5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChEUi5RMV9kb3duX21pbnVzLCBEUi5RMl9kb3duX21pbnVzLCBEUi5RM19kb3duX21pbnVzLCBEUi5RNF9kb3duX21pbnVzKQpEUi53aW5kb3dfbGVuID0gMjAwMAoKRFIuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKERSLlFzLnBsdXMudXAubGlzdCwgRFIuUXMubWludXMubGlzdCwgRFIuUXMucGx1cy5kb3duLmxpc3QsIERSLlFzLm1pbnVzLmRvd24ubGlzdCwgRFIud2luZG93X2xlbikKCgogIAoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkhfRE5BLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnExLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnE0LmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQoKSF9ETkEuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMy5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQoKSF9ETkEuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMi5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnExLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQoKSF9ETkEuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoSF9ETkEuUTFfdXBfcGx1cywgSF9ETkEuUTJfdXBfcGx1cywgSF9ETkEuUTNfdXBfcGx1cywgSF9ETkEuUTRfdXBfcGx1cykKSF9ETkEuUXMubWludXMubGlzdCA8LSBsaXN0KEhfRE5BLlExX3VwX21pbnVzLCBIX0ROQS5RMl91cF9taW51cywgSF9ETkEuUTNfdXBfbWludXMsIEhfRE5BLlE0X3VwX21pbnVzKQpIX0ROQS5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEhfRE5BLlExX2Rvd25fcGx1cywgSF9ETkEuUTJfZG93bl9wbHVzLCBIX0ROQS5RM19kb3duX3BsdXMsIEhfRE5BLlE0X2Rvd25fcGx1cykKSF9ETkEuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoSF9ETkEuUTFfZG93bl9taW51cywgSF9ETkEuUTJfZG93bl9taW51cywgSF9ETkEuUTNfZG93bl9taW51cywgSF9ETkEuUTRfZG93bl9taW51cykKSF9ETkEud2luZG93X2xlbiA9IDIwMDAKCkhfRE5BLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhIX0ROQS5Rcy5wbHVzLnVwLmxpc3QsIEhfRE5BLlFzLm1pbnVzLmxpc3QsIEhfRE5BLlFzLnBsdXMuZG93bi5saXN0LCBIX0ROQS5Rcy5taW51cy5kb3duLmxpc3QsIEhfRE5BLndpbmRvd19sZW4pCgoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpJUi5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCgpJUi5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCgpJUi5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCgpJUi5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChJUi5RMV91cF9wbHVzLCBJUi5RMl91cF9wbHVzLCBJUi5RM191cF9wbHVzLCBJUi5RNF91cF9wbHVzKQpJUi5Rcy5taW51cy5saXN0IDwtIGxpc3QoSVIuUTFfdXBfbWludXMsIElSLlEyX3VwX21pbnVzLCBJUi5RM191cF9taW51cywgSVIuUTRfdXBfbWludXMpCklSLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoSVIuUTFfZG93bl9wbHVzLCBJUi5RMl9kb3duX3BsdXMsIElSLlEzX2Rvd25fcGx1cywgSVIuUTRfZG93bl9wbHVzKQpJUi5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChJUi5RMV9kb3duX21pbnVzLCBJUi5RMl9kb3duX21pbnVzLCBJUi5RM19kb3duX21pbnVzLCBJUi5RNF9kb3duX21pbnVzKQpJUi53aW5kb3dfbGVuID0gMjAwMAoKSVIuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKElSLlFzLnBsdXMudXAubGlzdCwgSVIuUXMubWludXMubGlzdCwgSVIuUXMucGx1cy5kb3duLmxpc3QsIElSLlFzLm1pbnVzLmRvd24ubGlzdCwgSVIud2luZG93X2xlbikKCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCk1SLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnExLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMy5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnE0LmJlZC5NUnMubGlzdC5vdXQubnVtIikKCk1SLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMi5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMy5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCgpNUi5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnExLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMi5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnE0LmJlZC5NUnMubGlzdC5vdXQubnVtIikKCk1SLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnExLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMy5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5NUnMubGlzdC5vdXQubnVtIikKCk1SLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KE1SLlExX3VwX3BsdXMsIE1SLlEyX3VwX3BsdXMsIE1SLlEzX3VwX3BsdXMsIE1SLlE0X3VwX3BsdXMpCk1SLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChNUi5RMV91cF9taW51cywgTVIuUTJfdXBfbWludXMsIE1SLlEzX3VwX21pbnVzLCBNUi5RNF91cF9taW51cykKTVIuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChNUi5RMV9kb3duX3BsdXMsIE1SLlEyX2Rvd25fcGx1cywgTVIuUTNfZG93bl9wbHVzLCBNUi5RNF9kb3duX3BsdXMpCk1SLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KE1SLlExX2Rvd25fbWludXMsIE1SLlEyX2Rvd25fbWludXMsIE1SLlEzX2Rvd25fbWludXMsIE1SLlE0X2Rvd25fbWludXMpCk1SLndpbmRvd19sZW4gPSAyMDAwCgpNUi5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoTVIuUXMucGx1cy51cC5saXN0LCBNUi5Rcy5taW51cy5saXN0LCBNUi5Rcy5wbHVzLmRvd24ubGlzdCwgTVIuUXMubWludXMuZG93bi5saXN0LCBNUi53aW5kb3dfbGVuKQoKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKClNUUi5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuU1RScy5saXN0Lm91dC5udW0iKQoKU1RSLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuU1RScy5saXN0Lm91dC5udW0iKQoKU1RSLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKClNUUi5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuU1RScy5saXN0Lm91dC5udW0iKQoKU1RSLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KFNUUi5RMV91cF9wbHVzLCBTVFIuUTJfdXBfcGx1cywgU1RSLlEzX3VwX3BsdXMsIFNUUi5RNF91cF9wbHVzKQpTVFIuUXMubWludXMubGlzdCA8LSBsaXN0KFNUUi5RMV91cF9taW51cywgU1RSLlEyX3VwX21pbnVzLCBTVFIuUTNfdXBfbWludXMsIFNUUi5RNF91cF9taW51cykKU1RSLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoU1RSLlExX2Rvd25fcGx1cywgU1RSLlEyX2Rvd25fcGx1cywgU1RSLlEzX2Rvd25fcGx1cywgU1RSLlE0X2Rvd25fcGx1cykKU1RSLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KFNUUi5RMV9kb3duX21pbnVzLCBTVFIuUTJfZG93bl9taW51cywgU1RSLlEzX2Rvd25fbWludXMsIFNUUi5RNF9kb3duX21pbnVzKQpTVFIud2luZG93X2xlbiA9IDIwMDAKClNUUi5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoU1RSLlFzLnBsdXMudXAubGlzdCwgU1RSLlFzLm1pbnVzLmxpc3QsIFNUUi5Rcy5wbHVzLmRvd24ubGlzdCwgU1RSLlFzLm1pbnVzLmRvd24ubGlzdCwgU1RSLndpbmRvd19sZW4pCgpgYGAKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpaX0ROQS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpCgpaX0ROQS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KFpfRE5BLlExX3VwX3BsdXMsIFpfRE5BLlEyX3VwX3BsdXMsIFpfRE5BLlEzX3VwX3BsdXMsIFpfRE5BLlE0X3VwX3BsdXMpClpfRE5BLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChaX0ROQS5RMV91cF9taW51cywgWl9ETkEuUTJfdXBfbWludXMsIFpfRE5BLlEzX3VwX21pbnVzLCBaX0ROQS5RNF91cF9taW51cykKWl9ETkEuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChaX0ROQS5RMV9kb3duX3BsdXMsIFpfRE5BLlEyX2Rvd25fcGx1cywgWl9ETkEuUTNfZG93bl9wbHVzLCBaX0ROQS5RNF9kb3duX3BsdXMpClpfRE5BLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KFpfRE5BLlExX2Rvd25fbWludXMsIFpfRE5BLlEyX2Rvd25fbWludXMsIFpfRE5BLlEzX2Rvd25fbWludXMsIFpfRE5BLlE0X2Rvd25fbWludXMpClpfRE5BLndpbmRvd19sZW4gPSAyMDAwCgpaX0ROQS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoWl9ETkEuUXMucGx1cy51cC5saXN0LCBaX0ROQS5Rcy5taW51cy5saXN0LCBaX0ROQS5Rcy5wbHVzLmRvd24ubGlzdCwgWl9ETkEuUXMubWludXMuZG93bi5saXN0LCBaX0ROQS53aW5kb3dfbGVuKQoKYGBgCgoKCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTd9Ckc0LlFzLnRvdGFsWywgTm9uX0I6PSJHNCJdCkRSLlFzLnRvdGFsWywgTm9uX0I6PSJEUiJdCkhfRE5BLlFzLnRvdGFsWywgTm9uX0I6PSJILUROQSJdCklSLlFzLnRvdGFsWywgTm9uX0I6PSJJUiJdCk1SLlFzLnRvdGFsWywgTm9uX0I6PSJNUiJdClNUUi5Rcy50b3RhbFssIE5vbl9COj0iU1RSIl0KWl9ETkEuUXMudG90YWxbLCBOb25fQjo9IlotRE5BIl0KCgoKTm9uX0IuUXMuVE9UQUwgPC0gcmJpbmQoRzQuUXMudG90YWwsIERSLlFzLnRvdGFsLCBIX0ROQS5Rcy50b3RhbCwgSVIuUXMudG90YWwsIE1SLlFzLnRvdGFsLCBTVFIuUXMudG90YWwsIFpfRE5BLlFzLnRvdGFsKQoKTm9uX0IuUXMuVE9UQUwkUSA8LSBtYXB2YWx1ZXMoTm9uX0IuUXMuVE9UQUwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCgoKCmdncGxvdChOb25fQi5Rcy5UT1RBTCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBOb25fQiB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpgYGAKCgoKCgpgYGB7cn0KTm9uX0IuUXMuVE9UQUwuRW5ycmljaG1lbnRfUGVhayA8LSBOb25fQi5Rcy5UT1RBTFsgICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnk9IGMoIk5vbl9CIiwgImV4b25fcG9zIiwgIlEiKV0KCndyaXRlLnRhYmxlKE5vbl9CLlFzLlRPVEFMLkVucnJpY2htZW50X1BlYWssIGZpbGUgPSAiLi9UYWJsZXMvTm9uX0IuUXMuVE9UQUwuRW5ycmljaG1lbnRfUGVhay50eHQiLCBhcHBlbmQgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0IiwKICAgICAgICAgICAgZW9sID0gIlxuIiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIHJvdy5uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCBxbWV0aG9kID0gYygiZXNjYXBlIiwgImRvdWJsZSIpLAogICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiIikKYGBgCgoKCgoKCgojIFRlbXBsYXRlIC0gbm9uIHRlbXBsYXRlCgoKVG8gaW52ZXN0aWdhdGUgaWYgdGhlIGRpc3RyaWJ1dGlvbiBvZiBub24tQiBETkEgbW90aWZzIGlzIGJpYXNlZCBieSB0cmFuc2NyaXB0aW9uIGRpcmVjdGlvbiwgd2UgZ2VuZXJhdGUgYC5udW1gIGZpbGVzIHdoZXJlIHRoZSBjb3VudHMgd2VyZSBzZXBhcmF0ZWQgYnkgdGVtcGxhdGUgYW5kIG5vbiB0ZW1wbGF0ZWQgc3RyYW5kczoKCgoqIFRlbXBsYXRlID0gcGx1c19taW51cywgbWludXNfcGx1cwoqIE5vbi10ZW1wbGF0ZSA9IG1pbnVzX21pbnVzLCBwbHVzX3BsdXMKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpHNC50ZW1wbGF0ZS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnExLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTIuYmVkLkc0c19taW51c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMy5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnE0LmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC50ZW1wbGF0ZS5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTEuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnEyLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMy5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTQuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKCkc0LnRlbXBsYXRlLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnExLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEyLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEzLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnE0LmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC50ZW1wbGF0ZS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTIuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMy5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCgoKRzQubm9uX3RlbXBsYXRlLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTEuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMi5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnEzLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTQuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQoKRzQubm9uX3RlbXBsYXRlLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMS5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMi5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMy5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xNC5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKCkc0Lm5vbl90ZW1wbGF0ZS5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMS5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMi5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMy5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xNC5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC5ub25fdGVtcGxhdGUuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMS5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTIuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xNC5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKCgpgYGAKCgoKYGBge3J9Ckc0LnRlbXBsYXRlLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0LnRlbXBsYXRlLlExX3VwX3BsdXMsIEc0LnRlbXBsYXRlLlEyX3VwX3BsdXMsIEc0LnRlbXBsYXRlLlEzX3VwX3BsdXMsIEc0LnRlbXBsYXRlLlE0X3VwX3BsdXMpCkc0LnRlbXBsYXRlLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNC50ZW1wbGF0ZS5RMV91cF9taW51cywgRzQudGVtcGxhdGUuUTJfdXBfbWludXMsIEc0LnRlbXBsYXRlLlEzX3VwX21pbnVzLCBHNC50ZW1wbGF0ZS5RNF91cF9taW51cykKRzQudGVtcGxhdGUuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNC50ZW1wbGF0ZS5RMV9kb3duX3BsdXMsIEc0LnRlbXBsYXRlLlEyX2Rvd25fcGx1cywgRzQudGVtcGxhdGUuUTNfZG93bl9wbHVzLCBHNC50ZW1wbGF0ZS5RNF9kb3duX3BsdXMpCkc0LnRlbXBsYXRlLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0LnRlbXBsYXRlLlExX2Rvd25fbWludXMsIEc0LnRlbXBsYXRlLlEyX2Rvd25fbWludXMsIEc0LnRlbXBsYXRlLlEzX2Rvd25fbWludXMsIEc0LnRlbXBsYXRlLlE0X2Rvd25fbWludXMpCkc0LnRlbXBsYXRlLndpbmRvd19sZW4gPSAyMDAwCgpHNC50ZW1wbGF0ZS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzQudGVtcGxhdGUuUXMucGx1cy51cC5saXN0LCBHNC50ZW1wbGF0ZS5Rcy5taW51cy5saXN0LCBHNC50ZW1wbGF0ZS5Rcy5wbHVzLmRvd24ubGlzdCwgRzQudGVtcGxhdGUuUXMubWludXMuZG93bi5saXN0LCBHNC50ZW1wbGF0ZS53aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0Lm5vbl90ZW1wbGF0ZS5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNC5ub25fdGVtcGxhdGUuUTFfdXBfcGx1cywgRzQubm9uX3RlbXBsYXRlLlEyX3VwX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RM191cF9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTRfdXBfcGx1cykKRzQubm9uX3RlbXBsYXRlLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNC5ub25fdGVtcGxhdGUuUTFfdXBfbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RMl91cF9taW51cywgRzQubm9uX3RlbXBsYXRlLlEzX3VwX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTRfdXBfbWludXMpCkc0Lm5vbl90ZW1wbGF0ZS5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0Lm5vbl90ZW1wbGF0ZS5RMV9kb3duX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RMl9kb3duX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RM19kb3duX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RNF9kb3duX3BsdXMpCkc0Lm5vbl90ZW1wbGF0ZS5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNC5ub25fdGVtcGxhdGUuUTFfZG93bl9taW51cywgRzQubm9uX3RlbXBsYXRlLlEyX2Rvd25fbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RM19kb3duX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTRfZG93bl9taW51cykKRzQubm9uX3RlbXBsYXRlLndpbmRvd19sZW4gPSAyMDAwCgpHNC5ub25fdGVtcGxhdGUuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0Lm5vbl90ZW1wbGF0ZS5Rcy5wbHVzLnVwLmxpc3QsIEc0Lm5vbl90ZW1wbGF0ZS5Rcy5taW51cy5saXN0LCBHNC5ub25fdGVtcGxhdGUuUXMucGx1cy5kb3duLmxpc3QsIEc0Lm5vbl90ZW1wbGF0ZS5Rcy5taW51cy5kb3duLmxpc3QsIEc0LnRlbXBsYXRlLndpbmRvd19sZW4pCmBgYAoKCmBgYHtyfQoKRzQudGVtcGxhdGUuUXMudG90YWwKRzQubm9uX3RlbXBsYXRlLlFzLnRvdGFsCgoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsIDwtIHJiaW5kKEc0LnRlbXBsYXRlLlFzLnRvdGFsLCBHNC5ub25fdGVtcGxhdGUuUXMudG90YWwpCiAgCmhhbGZfbiA8LSBucm93KEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCkvMgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWxbLCBTdHJhbmQ6PXJlcChjKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiKSwgZWFjaD1oYWxmX24pIF0KICAKICAKICAKICAKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsJFN0cmFuZCA8LSAgZmFjdG9yKEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCRTdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgogIApgYGAKCgoKCmBgYHtyfQoKCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQoKCgoKCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5iaW5vbWlhbCA8LSBjYmluZChHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwsICBHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBoZzE5Lm5leG9ucy84KSBdKQpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuYmlub21pYWxbLCBtZWRpYW46PU5VTExdCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuYmlub21pYWxbICwgbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpLCBieT1jKCJleG9uX3BvcyIsICJRIiwgIlN0cmFuZCIpXQpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuYmlub21pYWxbLCBgOj1gKEVucnJpY2htZW50PVBvaW50RXN0L21lZGlhbiwgRW5ycmljaG1lbnRfbD1Mb3dlci9tZWRpYW4sIEVucnJpY2htZW50X3U9VXBwZXIvbWVkaWFuKV0KCgpGaWcyLkEgPC0gZ2dwbG90KEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5iaW5vbWlhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbiwgZmlsbD1RLCB5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSksIGFscGhhPTAuMykgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBTdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpGaWcyLkEKCmBgYAoKCgoKYGBge3J9CgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWwgPC0gRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsWyAsIC4oT2NjdXJyZW5jZXM9c3VtKE9jY3VycmVuY2VzKSkgLCBieT1jKCJTdHJhbmQiLCAiZXhvbl9wb3MiLCAiUG9zaXRpb24iKV0KCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbFsgLCBtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcykgLCBieT1jKCJTdHJhbmQiLCAiZXhvbl9wb3MiKV0KCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbFsgLCBFbnJyaWNobWVudDo9T2NjdXJyZW5jZXMvbWVkaWFuICwgYnk9YygiU3RyYW5kIiwgImV4b25fcG9zIiwgIlBvc2l0aW9uIildCgoKZ2dwbG90KEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIFN0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgoKYGBgCgoKYGBge3J9CgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxfUGVhayA8LSBHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxbICAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5PSBjKCJTdHJhbmQiLCAiZXhvbl9wb3MiKV0KCgp3cml0ZS50YWJsZShHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxfUGVhaywgZmlsZSA9ICIuL1RhYmxlcy9HNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxfUGVhay50eHQiLCBhcHBlbmQgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0IiwKICAgICAgICAgICAgZW9sID0gIlxuIiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIHJvdy5uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCBxbWV0aG9kID0gYygiZXNjYXBlIiwgImRvdWJsZSIpLAogICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiIikKYGBgCgoKCmBgYHtyfQoKCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5FbnJyaWNobWVudF9QZWFrIDwtIEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbFsgICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnk9IGMoICJleG9uX3BvcyIsICJRIiwgIlN0cmFuZCIgKV0KCndyaXRlLnRhYmxlKEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5FbnJyaWNobWVudF9QZWFrLCBmaWxlID0gIi4vVGFibGVzL0c0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5FbnJyaWNobWVudF9QZWFrLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLAogICAgICAgICAgICBlb2wgPSAiXG4iLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgIGNvbC5uYW1lcyA9IFRSVUUsIHFtZXRob2QgPSBjKCJlc2NhcGUiLCAiZG91YmxlIiksCiAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICIiKQoKYGBgCgoKIyBHNCBSVU5TCgpIZXJlIHdlIGV4cGxvcmVkIHRoZSBlbnJpY2htZW50IG9mIEctcXVhZHJ1cGxleGVzIHdpdGggZGlmZmVyZW50IEctcnVuIGxlbmd0aAoKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpHMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuVHdpY2VfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkczX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9wbHVzLmJlZC5UaHJlZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX3BsdXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9wbHVzLmJlZC5GaXZlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuU2l4X0dfcnVucy5saXN0Lm91dC5udW0iKQoKRzFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9taW51cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX21pbnVzLmJlZC5Ud2ljZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9taW51cy5iZWQuVGhyZWVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLkZpdmVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc2X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLlNpeF9HX3J1bnMubGlzdC5vdXQubnVtIikKCkcxX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fcGx1cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLlR3aWNlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLlRocmVlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fcGx1cy5iZWQuRml2ZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzZfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9wbHVzLmJlZC5TaXhfR19ydW5zLmxpc3Qub3V0Lm51bSIpCgpHMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuVHdpY2VfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkczX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX21pbnVzLmJlZC5UaHJlZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpICAKRzVfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLkZpdmVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc2X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX21pbnVzLmJlZC5TaXhfR19ydW5zLmxpc3Qub3V0Lm51bSIpCmBgYAoKCgpgYGB7cn0KR3J1bnMudXBfcGx1cy5saXN0IDwtIGxpc3QoRzFfdXBfcGx1cywgRzJfdXBfcGx1cywgRzNfdXBfcGx1cywgRzRfdXBfcGx1cywgRzVfdXBfcGx1cywgRzZfdXBfcGx1cykKR3J1bnMudXBfbWludXMubGlzdCA8LSBsaXN0KEcxX3VwX21pbnVzLCBHMl91cF9taW51cywgRzNfdXBfbWludXMsIEc0X3VwX21pbnVzLCBHNV91cF9taW51cywgRzZfdXBfbWludXMpCgpHcnVucy5kb3duX3BsdXMubGlzdCA8LSBsaXN0KEcxX2Rvd25fcGx1cywgRzJfZG93bl9wbHVzLCBHM19kb3duX3BsdXMsIEc0X2Rvd25fcGx1cywgRzVfZG93bl9wbHVzLCBHNl9kb3duX3BsdXMpCkdydW5zLmRvd25fbWludXMubGlzdCA8LSBsaXN0KEcxX2Rvd25fbWludXMsIEcyX2Rvd25fbWludXMsIEczX2Rvd25fbWludXMsIEc0X2Rvd25fbWludXMsIEc1X2Rvd25fbWludXMsIEc2X2Rvd25fbWludXMpCgoKR3J1bnMud2luZG93X2xlbiA9IDIwMDAKCkdydW5zLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHcnVucy51cF9wbHVzLmxpc3QsIEdydW5zLnVwX21pbnVzLmxpc3QsIEdydW5zLmRvd25fcGx1cy5saXN0LCBHcnVucy5kb3duX21pbnVzLmxpc3QsIEdydW5zLndpbmRvd19sZW4pCgpHcnVucy50b3RhbFssIEdfcnVuX2xlbmd0aDo9UV0KYGBgCgoKCmBgYHtyfQoKCkdydW5zLnRvdGFsLmJpbm9taWFsIDwtIGNiaW5kKEdydW5zLnRvdGFsLCAgR3J1bnMudG90YWxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBoZzE5Lm5leG9ucykgXSkKR3J1bnMudG90YWwuYmlub21pYWxbLCBtZWRpYW46PU5VTExdCgpHcnVucy50b3RhbC5iaW5vbWlhbFsgLCBtZWRpYW46PW1lZGlhbihQb2ludEVzdCksIGJ5PWMoImV4b25fcG9zIiwgIlEiICldCkdydW5zLnRvdGFsLmJpbm9taWFsWywgYDo9YChFbnJyaWNobWVudD1Qb2ludEVzdC9tZWRpYW4sIEVucnJpY2htZW50X2w9TG93ZXIvbWVkaWFuLCBFbnJyaWNobWVudF91PVVwcGVyL21lZGlhbildCgoKRmlnMi5CIDwtIGdncGxvdChHcnVucy50b3RhbC5iaW5vbWlhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1HX3J1bl9sZW5ndGgpKSArCiAgZ2VvbV9yaWJib24oYWVzKHg9UG9zaXRpb24sIGZpbGw9USwgeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UpLCBhbHBoYT0wLjMpICsKICB4bGltKGMoLTEwMCwxMDApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpICsKICBsYWJzKGNvbG91ciA9ICJOdW1iZXIgb2YgY29uc2VjdXRpdmUgRy1ydW5zIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCkZpZzIuQgpgYGAKCgoKCgpgYGB7cn0KCkdydW5zLnRvdGFsLkVucnJpY2htZW50X1BlYWsgPC0gR3J1bnMudG90YWxbICAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5PSBjKCAiZXhvbl9wb3MiLCAiR19ydW5fbGVuZ3RoIildCgp3cml0ZS50YWJsZShHcnVucy50b3RhbC5FbnJyaWNobWVudF9QZWFrLCBmaWxlID0gIi4vVGFibGVzL0dydW5zLnRvdGFsLkVucnJpY2htZW50X1BlYWsudHh0IiwgYXBwZW5kID0gRkFMU0UsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsCiAgICAgICAgICAgIGVvbCA9ICJcbiIsIG5hID0gIk5BIiwgZGVjID0gIi4iLCByb3cubmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgcW1ldGhvZCA9IGMoImVzY2FwZSIsICJkb3VibGUiKSwKICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIiIpCmBgYAoKCgoKCgoKIyMgRzQgZW5yaWNobWVudCBhY3Jvc3MgZXZvbHV0aW9uCgoKCgpXZSBhbmFseXplZCB0aGUgRzQgZW5yaWNobWVudCBhY3Jvc3Mgc3BsaWNlIHNpdGVzIGZyb20gZGlmZmVyZW50IHNwZWNpZXMKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnN1c1NjcjExLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zdXNTY3IxMS5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLnN1c1NjcjExLnR4dC4ubGlzdC5vdXQubnVtIikKc3VzU2NyMTEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc3VzU2NyMTEuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLnN1c1NjcjExLnR4dC4ubGlzdC5vdXQubnVtIikKc3VzU2NyMTEudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zdXNTY3IxMS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zdXNTY3IxMS5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLnN1c1NjcjExLnR4dC4ubGlzdC5vdXQubnVtIikKc3VzU2NyMTEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0Kc3VzU2NyMTEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKc3VzU2NyMTEuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KHN1c1NjcjExLnVwX3BsdXMsIHN1c1NjcjExLnVwX21pbnVzLCBzdXNTY3IxMS5kb3duX3BsdXMsIHN1c1NjcjExLmRvd25fbWludXMpCgoKYGBgCgoKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KClRBSVIxMC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vVEFJUjEwLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL1RBSVIxMC5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vVEFJUjEwLmV4b24udXBfbWludXMuYmVkLnNjb3JlLlRBSVIxMC50eHQuLmxpc3Qub3V0Lm51bSIpClRBSVIxMC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vVEFJUjEwLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdClRBSVIxMC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpUQUlSMTAuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KFRBSVIxMC51cF9wbHVzLCBUQUlSMTAudXBfbWludXMsIFRBSVIxMC5kb3duX3BsdXMsIFRBSVIxMC5kb3duX21pbnVzKQoKCmBgYAoKCgoKCgpgYGB7ciwgIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKYW5vQ2FyMi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vYW5vQ2FyMi5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLmFub0NhcjIudHh0Li5saXN0Lm91dC5udW0iKQphbm9DYXIyLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2Fub0NhcjIuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmFub0NhcjIudHh0Li5saXN0Lm91dC5udW0iKQphbm9DYXIyLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vYW5vQ2FyMi5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5hbm9DYXIyLnR4dC4ubGlzdC5vdXQubnVtIikKYW5vQ2FyMi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vYW5vQ2FyMi5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLmFub0NhcjIudHh0Li5saXN0Lm91dC5udW0iKQphbm9DYXIyLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmFub0NhcjIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKYW5vQ2FyMi5UT1RBTCA8LSBwbG90X2RlbnNpdHkoYW5vQ2FyMi51cF9wbHVzLCBhbm9DYXIyLnVwX21pbnVzLCBhbm9DYXIyLmRvd25fcGx1cywgYW5vQ2FyMi5kb3duX21pbnVzKQoKCmBgYAoKCgpgYGB7ciwgIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKeGVuVHJvOS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24veGVuVHJvOS5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLnhlblRybzkudHh0Li5saXN0Lm91dC5udW0iKQp4ZW5Ucm85LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3hlblRybzkuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLnhlblRybzkudHh0Li5saXN0Lm91dC5udW0iKQp4ZW5Ucm85LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24veGVuVHJvOS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24veGVuVHJvOS5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLnhlblRybzkudHh0Li5saXN0Lm91dC5udW0iKQp4ZW5Ucm85LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCnhlblRybzkuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKeGVuVHJvOS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoeGVuVHJvOS51cF9wbHVzLCB4ZW5Ucm85LnVwX21pbnVzLCB4ZW5Ucm85LmRvd25fcGx1cywgeGVuVHJvOS5kb3duX21pbnVzKQoKCmBgYAoKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmNlMTAudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2NlMTAuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9jZTEwLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2NlMTAuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuY2UxMC50eHQuLmxpc3Qub3V0Lm51bSIpCmNlMTAuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2NlMTAuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpjZTEwLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmNlMTAuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGNlMTAudXBfcGx1cywgY2UxMC51cF9taW51cywgY2UxMC5kb3duX3BsdXMsIGNlMTAuZG93bl9taW51cykKCgpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpkYW5SZXIxMS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZGFuUmVyMTEuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RhblJlcjExLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZGFuUmVyMTEuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuZGFuUmVyMTEudHh0Li5saXN0Lm91dC5udW0iKQpkYW5SZXIxMS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZGFuUmVyMTEuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRhblJlcjExLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmRhblJlcjExLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShkYW5SZXIxMS51cF9wbHVzLCBkYW5SZXIxMS51cF9taW51cywgZGFuUmVyMTEuZG93bl9wbHVzLCBkYW5SZXIxMS5kb3duX21pbnVzKQoKCmBgYAoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCm1tMTAudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL21tMTAuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5tbTEwLnR4dC4ubGlzdC5vdXQubnVtIikKbW0xMC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9tbTEwLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5tbTEwLnR4dC4ubGlzdC5vdXQubnVtIikKbW0xMC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL21tMTAuZXhvbi51cF9taW51cy5iZWQuc2NvcmUubW0xMC50eHQuLmxpc3Qub3V0Lm51bSIpCm1tMTAuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL21tMTAuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5tbTEwLnR4dC4ubGlzdC5vdXQubnVtIikKbW0xMC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQptbTEwLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCm1tMTAuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KG1tMTAudXBfcGx1cywgbW0xMC51cF9taW51cywgbW0xMC5kb3duX3BsdXMsIG1tMTAuZG93bl9taW51cykKCgpgYGAKCgpgYGB7ciwgIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKaGcxOS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vaGcxOS5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLmhnMTkudHh0Li5saXN0Lm91dC5udW0iKQpoZzE5LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2hnMTkuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmhnMTkudHh0Li5saXN0Lm91dC5udW0iKQpoZzE5LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vaGcxOS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vaGcxOS5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLmhnMTkudHh0Li5saXN0Lm91dC5udW0iKQpoZzE5LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmhnMTkuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKaGcxOS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoaGcxOS51cF9wbHVzLCBoZzE5LnVwX21pbnVzLCBoZzE5LmRvd25fcGx1cywgaGcxOS5kb3duX21pbnVzKQoKCmBgYAoKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmRtNi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZG02LmV4b24udXBfcGx1cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RtNi5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZG02LmV4b24udXBfbWludXMuYmVkLnNjb3JlLmRtNi50eHQuLmxpc3Qub3V0Lm51bSIpCmRtNi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZG02LmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRtNi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpkbTYuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGRtNi51cF9wbHVzLCBkbTYudXBfbWludXMsIGRtNi5kb3duX3BsdXMsIGRtNi5kb3duX21pbnVzKQoKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpnYWxHYWw1LnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9nYWxHYWw1LmV4b24udXBfcGx1cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZ2FsR2FsNS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9nYWxHYWw1LmV4b24udXBfbWludXMuYmVkLnNjb3JlLmdhbEdhbDUudHh0Li5saXN0Lm91dC5udW0iKQpnYWxHYWw1LmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9nYWxHYWw1LmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZ2FsR2FsNS5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpnYWxHYWw1LlRPVEFMIDwtIHBsb3RfZGVuc2l0eShnYWxHYWw1LnVwX3BsdXMsIGdhbEdhbDUudXBfbWludXMsIGdhbEdhbDUuZG93bl9wbHVzLCBnYWxHYWw1LmRvd25fbWludXMpCgoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKc2FjQ2VyLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zYWNDZXIzLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zYWNDZXIzLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5zYWNDZXIzLnR4dC4ubGlzdC5vdXQubnVtIikKc2FjQ2VyLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc2FjQ2VyMy5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5zYWNDZXIzLnR4dC4ubGlzdC5vdXQubnVtIikKc2FjQ2VyLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9zYWNDZXIzLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpzYWNDZXIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKc2FjQ2VyLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShzYWNDZXIudXBfcGx1cywgc2FjQ2VyLnVwX21pbnVzLCBzYWNDZXIuZG93bl9wbHVzLCBzYWNDZXIuZG93bl9taW51cykKCgpgYGAKCgoKCgpgYGB7ciB9CgoKCmNlMTAuVE9UQUxbLCBzcGVjaWVzOj0iQy4gZWxlZ2FucyJdIApoZzE5LlRPVEFMWywgc3BlY2llczo9IkguIHNhcGllbnMiXSAKbW0xMC5UT1RBTFssIHNwZWNpZXM6PSJNLiBtdXNjdWx1cyJdCmRhblJlcjExLlRPVEFMWywgc3BlY2llczo9IkQuIHJlcmlvIl0gCmRtNi5UT1RBTFssIHNwZWNpZXM6PSJELiBtZWxhbm9nYXN0ZXIiXQpnYWxHYWw1LlRPVEFMWywgc3BlY2llczo9IkcuIGdhbGx1cyJdCnNhY0Nlci5UT1RBTFssIHNwZWNpZXM6PSJTLiBjZXJldmlzaWFlIl0KCgp4ZW5Ucm85LlRPVEFMWyAsIHNwZWNpZXM6PSJYLiB0cm9waWNhbGlzIiBdCmFub0NhcjIuVE9UQUxbICAsIHNwZWNpZXM6PSJBLiBjYXJvbGluZW5zaXMiIF0KVEFJUjEwLlRPVEFMWyAgLCBzcGVjaWVzOj0iQS4gdGhhbGlhbmEiIF0Kc3VzU2NyMTEuVE9UQUxbICwgc3BlY2llczo9IlMuIHNjcm9mYSJdCgpBbGwuc3BlY2llcy5UT1RBTCA8LSByYmluZChoZzE5LlRPVEFMLCBtbTEwLlRPVEFMLCBnYWxHYWw1LlRPVEFMLCBkYW5SZXIxMS5UT1RBTCwgYW5vQ2FyMi5UT1RBTCwgeGVuVHJvOS5UT1RBTCwgIHN1c1NjcjExLlRPVEFMICApCgoKI0FsbC5zcGVjaWVzLlRPVEFMLmJpbm9taWFsIDwtIGNiaW5kKEFsbC5zcGVjaWVzLlRPVEFMLCAgR3J1bnMudG90YWxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBoZzE5Lm5leG9ucykgXSkKI0FsbC5zcGVjaWVzLlRPVEFMLmJpbm9taWFsWywgbWVkaWFuOj1OVUxMXQoKI0FsbC5zcGVjaWVzLlRPVEFMLmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAic3BlY2llcyIgKV0KI0FsbC5zcGVjaWVzLlRPVEFMLmJpbm9taWFsWywgYDo9YChFbnJyaWNobWVudD1Qb2ludEVzdC9tZWRpYW4sIEVucnJpY2htZW50X2w9TG93ZXIvbWVkaWFuLCBFbnJyaWNobWVudF91PVVwcGVyL21lZGlhbildCgoKCkZpZzYuQiA8LSBnZ3Bsb3QoQWxsLnNwZWNpZXMuVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG9yPXNwZWNpZXMpKSArCiAgICAjICAgZ2VvbV9yaWJib24oYWVzKHg9UG9zaXRpb24sIGZpbGw9c3BlY2llcywgeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UpLCBhbHBoYT0wLjMpICsKICAgIHhsaW0oYygtMzAwLDMwMCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lX2J3KCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKRmlnNi5CCgpgYGAKCldlIHBsb3Qgb3RoZXIgc3BlY2llcyB0aGF0IGRpZCBub3Qgc2hvdyBzdHJvbmcgZW5yaWNobWVudCBieSBzZXBhcmF0ZQoKYGBge3J9CgoKCkFsbC5zcGVjaWVzLlRPVEFMIDwtIHJiaW5kKGhnMTkuVE9UQUwsIG1tMTAuVE9UQUwsIGdhbEdhbDUuVE9UQUwsIGRhblJlcjExLlRPVEFMLCBhbm9DYXIyLlRPVEFMLCB4ZW5Ucm85LlRPVEFMLCAgc3VzU2NyMTEuVE9UQUwgICkKU3VwNi5BIDwtIGdncGxvdChBbGwuc3BlY2llcy5UT1RBTCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3I9c3BlY2llcykpICsKICAgICMgICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbiwgZmlsbD1zcGVjaWVzLCB5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSksIGFscGhhPTAuMykgKwogICAgeGxpbShjKC0zMDAsMzAwKSkgKwogICAgZ2d0aXRsZSggIlZlcnRlYnJhdGVzIikgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgICBsYWJzKGNvbG9yPSJTcGVjaWUiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKQWxsLnNwZWNpZXMuVE9UQUwgPC0gcmJpbmQoY2UxMC5UT1RBTCwgZG02LlRPVEFMLCBUQUlSMTAuVE9UQUwgICkKU3VwNi5CIDwtIGdncGxvdChBbGwuc3BlY2llcy5UT1RBTCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3I9c3BlY2llcykpICsKICAgIHhsaW0oYygtMzAwLDMwMCkpICsKICAgIGdndGl0bGUoICJOb24tdmVydGVicmF0ZXMiKSArCiAgICAgIGxhYnMoY29sb3I9IlNwZWNpZSIpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIApgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KcGxvdF9ncmlkKFN1cDYuQSxTdXA2LkIsIGxhYmVscyA9ICJBVVRPIiwgbmNvbCA9IDEgKQpgYGAKCiMgRzQgYW5kIGdlbmUgc3RydWN0dXJlCgoKIyMgRmxhbmtpbmcgaW50cm9uIHNpemUgCgpIZXJlIHdlIGFuYWxpemVkIHRoZSBpbnRyb24gc2l6ZSBvZiBkaXN0cmlidXRpb24gb2YgZXhvbiB3aGljaCBhcmUgZmxhbmtlZCBieSBHNCAob24gYW4gMTAwbnQgd2luZG93KQoKCgpgYGB7cn0KCgppbnRyb25fc2l6ZV91cHN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV91cHN0cmVhbV8xMDBudF93aW5kb3cuYmVkLnBsdXNfc3RyYW5kX2dlbm9tZS5wbHVzX0c0cycpLCAgCiBmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpKQoKaW50cm9uX3NpemVfZG93bnN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJyksICAKIGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQubWludXNfc3RyYW5kX2dlbm9tZS5taW51c19HNHMnKSkKCgppbnRyb25fc2l6ZV91cHN0cmVhbV90ZW1wbGF0ZSAgPC0gcmJpbmQoZnJlYWQoJy4vSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X3Vwc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpLCAgCiBmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJykpCgppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlICA8LSByYmluZChmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfZG93bnN0cmVhbV8xMDBudF93aW5kb3cuYmVkLm1pbnVzX3N0cmFuZF9nZW5vbWUucGx1c19HNHMnKSwgIAogZnJlYWQoJy4vSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X2Rvd25zdHJlYW1fMTAwbnRfd2luZG93LmJlZC5wbHVzX3N0cmFuZF9nZW5vbWUubWludXNfRzRzJykpCgoKaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9InVwc3RyZWFtIiwgc3RyYW5kPSJub25fdGVtcGxhdGUiKSBdCmludHJvbl9zaXplX2Rvd25zdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9Im5vbl90ZW1wbGF0ZSIpIF0KaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGVbICwgYDo9YChleG9uX3Bvcz0idXBzdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQoKaW50cm9uX3NpemVfVE9UQUwgPC0gcmJpbmQoaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlLCBpbnRyb25fc2l6ZV9kb3duc3RyZWFtX25vbl90ZW1wbGF0ZSwgaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGUsIGludHJvbl9zaXplX2Rvd25zdHJlYW1fdGVtcGxhdGUgKQoKY29sbmFtZXMoaW50cm9uX3NpemVfVE9UQUwpIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiaW50cm9uX251bWJlciIsICJpbnRyb25fc2l6ZSIsICJUcmFuc2NyaXB0IiwgIkc0IiwgImV4b25fcG9zIiwgIlN0cmFuZCIgICkKCgpgYGAKCgoKYGBge3J9CmludHJvbl9zaXplX1RPVEFMWyAgRzQ+MCwgRzRfdHlwZTo9IldpdGggRzQiIF0KaW50cm9uX3NpemVfVE9UQUxbICBHND09MCwgRzRfdHlwZTo9IldpdGhvdXQgRzQiIF0KCmludHJvbl9zaXplX1RPVEFMJGV4b25fcG9zIDwtIGZhY3RvcihpbnRyb25fc2l6ZV9UT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoInVwc3RyZWFtIiwgImRvd25zdHJlYW0iKSkKCkZpZzMuQSA8LSBnZ3Bsb3QoZGF0YT1pbnRyb25fc2l6ZV9UT1RBTCkgKwogIGdlb21fYm94cGxvdCggYWVzKHg9RzRfdHlwZSwgeT1sb2cxMChpbnRyb25fc2l6ZSkgKSApICsKICBmYWNldF9ncmlkKCAuIH4gIGV4b25fcG9zICkgKwogIHhsYWIoIiIpKwogIHlsYWIoImxvZzEwKEludHJvbiBzaXplKSIpICsKICB0aGVtZV9idygpCgoKRmlnMy5BCgpgYGAKCgpgYGB7cn0KbG9uZ19pbnRyb25zLjVzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fNXNzXy5iZWQuY2xvc2VzdC5HNHMiKQpzaG9ydF9pbnRyb25zLjVzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzVzc18uYmVkLmNsb3Nlc3QuRzRzIikKbG9uZ19pbnRyb25zLjNzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fM3NzXy5iZWQuY2xvc2VzdC5HNHMiKQpzaG9ydF9pbnRyb25zLjNzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzNzc18uYmVkLmNsb3Nlc3QuRzRzIikKCgpjb2xuYW1lcyhsb25nX2ludHJvbnMuNXNzKSA8LSBjKCJpLmNocm9tIiwgImkuc3RhcnQiLCAiaS5lbmQiLCAiaS5pZCIsICJpLkdDIiwgImkuc3RyYW5kIiwgImcuY2hyb20iLCAiZy5zdGFydCIsICJnLmVuZCIsICJkaXN0IikKY29sbmFtZXMoc2hvcnRfaW50cm9ucy41c3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhsb25nX2ludHJvbnMuM3NzKSA8LSBjKCJpLmNocm9tIiwgImkuc3RhcnQiLCAiaS5lbmQiLCAiaS5pZCIsICJpLkdDIiwgImkuc3RyYW5kIiwgImcuY2hyb20iLCAiZy5zdGFydCIsICJnLmVuZCIsICJkaXN0IikKY29sbmFtZXMoc2hvcnRfaW50cm9ucy4zc3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQoKbG9uZ19pbnRyb25zLmJlZCA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZCIpCnNob3J0X2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vc2hvcnRfaW50cm9ucy5zYW1lX0dDLmJlZCIpCmxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2UgPC0gIGNiaW5kKGxvbmdfaW50cm9ucy5iZWQsIHNob3J0X2ludHJvbnMuYmVkKVsgLCBjKDQsIDIsIDMgLCA1LDEwLCA4LCA5LCAxMSldCgpjb2xuYW1lcyhsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlKSA8LSBjKCJsLmlkIiwgImwuc3RhcnQiLCAibC5lbmQiLCAibC5HQyIsICJzLmlkIiwgInMuc3RhcnQiLCAicy5lbmQiLCAicy5HQyIgICkKbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVssIHMubGVuOj0ocy5lbmQtcy5zdGFydCldCgoKbG9uZ19pbnRyb25zLjVzc1ssIEc0LjVzczo9RkFMU0UgXQpsb25nX2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjVzczo9VFJVRSBdCmxvbmdfaW50cm9ucy41c3NbIGRpc3Q8PTEwMCAmIGkuc3RyYW5kPT0iLSIgJiBpLnN0YXJ0PmcuZW5kICwgRzQuNXNzOj1UUlVFIF0KCnNob3J0X2ludHJvbnMuNXNzWywgRzQuNXNzOj1GQUxTRSBdCnNob3J0X2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjVzczo9VFJVRSBdCnNob3J0X2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjVzczo9VFJVRSBdCgpsb25nX3Nob3J0LjJ4Mi41c3MgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zLjVzc1tHNC41c3M9PUZBTFNFXSksIG5yb3coc2hvcnRfaW50cm9ucy41c3NbRzQuNXNzPT1GQUxTRV0pLCBucm93KGxvbmdfaW50cm9ucy41c3NbRzQuNXNzPT1UUlVFXSksIG5yb3coc2hvcnRfaW50cm9ucy41c3NbRzQuNXNzPT1UUlVFXSkgKSkKCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIuNXNzKQoKCmxvbmdfaW50cm9ucy4zc3NbLCBHNC4zc3M6PUZBTFNFIF0KbG9uZ19pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQpsb25nX2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjNzczo9VFJVRSBdCgpzaG9ydF9pbnRyb25zLjNzc1ssIEc0LjNzczo9RkFMU0UgXQpzaG9ydF9pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQpzaG9ydF9pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSItIiAmIGkuc3RhcnQ+Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQoKbG9uZ19zaG9ydC4yeDIuM3NzIDwtIG1hdHJpeChucm93ID0gMiwgYyhucm93KGxvbmdfaW50cm9ucy4zc3NbRzQuM3NzPT1GQUxTRV0pLCBucm93KHNob3J0X2ludHJvbnMuM3NzW0c0LjNzcz09RkFMU0VdKSwgbnJvdyhsb25nX2ludHJvbnMuM3NzW0c0LjNzcz09VFJVRV0pLCBucm93KHNob3J0X2ludHJvbnMuM3NzW0c0LjNzcz09VFJVRV0pICkpCgpjaGlzcS50ZXN0KGxvbmdfc2hvcnQuMngyLjNzcykKCgoKCgpsb25nX2ludHJvbnMgPC0gbWVyZ2UoIGxvbmdfaW50cm9ucy41c3MsIGxvbmdfaW50cm9ucy4zc3MsIGJ5PWMoImkuaWQiLCAiaS5HQyIgKSkKc2hvcnRfaW50cm9ucyA8LSBtZXJnZSggc2hvcnRfaW50cm9ucy41c3MsIHNob3J0X2ludHJvbnMuM3NzLCBieT1jKCJpLmlkIiwgImkuR0MiICkpCgoKCgoKbG9uZ19zaG9ydC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zWyghRzQuM3NzICYgIUc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9uc1soIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9uc1soRzQuM3NzIHwgRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zWyhHNC4zc3MgfCBHNC41c3MpLCBdKSApKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIpCgoKIyMgT25seSBjb25zaWRlcmluZyBzaG9ydCBpbnRyb25zIGxvbmdlciB0aGFuIDUwCgoKCgoKbG9uZ19pbnRyb25zIDwtIGxvbmdfaW50cm9uc1tpLmlkICVpbiUgbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVtzLmxlbj41MCwgbC5pZF1dCnNob3J0X2ludHJvbnMgPC0gc2hvcnRfaW50cm9uc1tpLmlkICVpbiUgbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVtzLmxlbj41MCwgcy5pZF1dCgoKbG9uZ19zaG9ydC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zWyghRzQuM3NzICYgIUc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9uc1soIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9uc1soRzQuM3NzIHwgRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zWyhHNC4zc3MgfCBHNC41c3MpLCBdKSApKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIpCgoKCnNob3J0X2ludHJvbnNbLCB0eXBlOj0iU2hvcnQiXQpsb25nX2ludHJvbnNbLCB0eXBlOj0iTG9uZyJdCgpsb25nX2ludHJvbnMkdHlwZSA8LSBmYWN0b3IobG9uZ19pbnRyb25zJHR5cGUsIGxldmVscz1jKCJTaG9ydCIsICJMb25nIikpCgoKCmxvbmdfc2hvcnRfaW50cm9ucyA8LSByYmluZChsb25nX2ludHJvbnMsIHNob3J0X2ludHJvbnMpCgpnZ3Bsb3QobG9uZ19zaG9ydF9pbnRyb25zKSArCiAgZ2VvbV92aW9saW4oYWVzKCB0eXBlLCBpLkdDKSkKCgpnZ3Bsb3QobG9uZ19zaG9ydF9pbnRyb25zKSArCiAgZ2VvbV9iYXIoYWVzKHg9dHlwZSwgZmlsbD0oKEc0LjNzcyB8IEc0LjVzcykgKSwgc3RhdD0iY291bnQiICkpCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBgCgoKCmBgYHtyfQpsb25nX2ludHJvbnMuNXNzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fNXNzLmJlZC5jbG9zZXN0Lkc0cyIpCnNob3J0X2ludHJvbnMuNXNzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzVzcy5iZWQuY2xvc2VzdC5HNHMiKQpsb25nX2ludHJvbnMuM3NzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fM3NzLmJlZC5jbG9zZXN0Lkc0cyIpCnNob3J0X2ludHJvbnMuM3NzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzNzcy5iZWQuY2xvc2VzdC5HNHMiKQoKCmNvbG5hbWVzKGxvbmdfaW50cm9ucy41c3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhzaG9ydF9pbnRyb25zLjVzcykgPC0gYygiaS5jaHJvbSIsICJpLnN0YXJ0IiwgImkuZW5kIiwgImkuaWQiLCAiaS5HQyIsICJpLnN0cmFuZCIsICJnLmNocm9tIiwgImcuc3RhcnQiLCAiZy5lbmQiLCAiZGlzdCIpCmNvbG5hbWVzKGxvbmdfaW50cm9ucy4zc3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhzaG9ydF9pbnRyb25zLjNzcykgPC0gYygiaS5jaHJvbSIsICJpLnN0YXJ0IiwgImkuZW5kIiwgImkuaWQiLCAiaS5HQyIsICJpLnN0cmFuZCIsICJnLmNocm9tIiwgImcuc3RhcnQiLCAiZy5lbmQiLCAiZGlzdCIpCgpsb25nX2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZCIpCnNob3J0X2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQiKQpsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlIDwtICBjYmluZChsb25nX2ludHJvbnMuYmVkLCBzaG9ydF9pbnRyb25zLmJlZClbICwgYyg0LCAyLCAzICwgNSwxMCwgOCwgOSwgMTEpXQoKY29sbmFtZXMobG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZSkgPC0gYygibC5pZCIsICJsLnN0YXJ0IiwgImwuZW5kIiwgImwuR0MiLCAicy5pZCIsICJzLnN0YXJ0IiwgInMuZW5kIiwgInMuR0MiICApCmxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VbLCBzLmxlbjo9KHMuZW5kLXMuc3RhcnQpXQoKbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZV8zNUsgPC0gaGVhZChsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlLCAxNzUwMCkKCgoKCmxvbmdfaW50cm9ucy41c3NbLCBHNC41c3M6PUZBTFNFIF0KbG9uZ19pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQpsb25nX2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjVzczo9VFJVRSBdCgpzaG9ydF9pbnRyb25zLjVzc1ssIEc0LjVzczo9RkFMU0UgXQpzaG9ydF9pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQpzaG9ydF9pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSItIiAmIGkuc3RhcnQ+Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQoKbG9uZ19pbnRyb25zLjNzc1ssIEc0LjNzczo9RkFMU0UgXQpsb25nX2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjNzczo9VFJVRSBdCmxvbmdfaW50cm9ucy4zc3NbIGRpc3Q8PTEwMCAmIGkuc3RyYW5kPT0iLSIgJiBpLnN0YXJ0PmcuZW5kICwgRzQuM3NzOj1UUlVFIF0KCnNob3J0X2ludHJvbnMuM3NzWywgRzQuM3NzOj1GQUxTRSBdCnNob3J0X2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjNzczo9VFJVRSBdCnNob3J0X2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjNzczo9VFJVRSBdCgoKbG9uZ19pbnRyb25zIDwtIG1lcmdlKCBsb25nX2ludHJvbnMuNXNzLCBsb25nX2ludHJvbnMuM3NzLCBieT1jKCJpLmlkIiwgImkuR0MiICkpCnNob3J0X2ludHJvbnMgPC0gbWVyZ2UoIHNob3J0X2ludHJvbnMuNXNzLCBzaG9ydF9pbnRyb25zLjNzcywgYnk9YygiaS5pZCIsICJpLkdDIiApKQoKCmxvbmdfaW50cm9uc1ssIEc0Oj1GQUxTRV0KbG9uZ19pbnRyb25zW0c0LjNzcyB8IEc0LjVzcyAsIEc0Oj1UUlVFXQpzaG9ydF9pbnRyb25zWywgRzQ6PUZBTFNFXQpzaG9ydF9pbnRyb25zW0c0LjNzcyB8IEc0LjVzcyAsIEc0Oj1UUlVFXQoKCgoKaS5taW5zIDwtIHNlcSg1MCw0NTAsNTApCmkubWF4cyA8LSBzZXEoMTAwLDUwMCw1MCkKCgoKaS5taW5zIDwtIHNlcSg1MCw0NTAsNTApCmkubWF4cyA8LSBzZXEoMTAwLDUwMCw1MCkKCgppLm1pbnMgPC0gc2VxKDAsNDAwLDEwMCkKaS5tYXhzIDwtIHNlcSgxMDAsNTAwLDEwMCkKCnNob3J0X2xvbmcub2RkX3JhdGlvcyA8LSBjKCkKc2hvcnRfbG9uZy5wdmFsdWVzPC0gYygpCnNob3J0X2xvbmcubG9uZy5mcmFxIDwtIGMoKQpzaG9ydF9sb25nLnNob3J0LmZyYXEgPC0gYygpCiAgCnNob3J0X2xvbmcuR0NzIDwtIGRhdGEudGFibGUoKQogIApmb3IgKGkgaW4gc2VxKDEsIGxlbmd0aChpLm1pbnMpKSkgewogICAgCiAgaS5taW4gPSBpLm1pbnNbaV0KICBpLm1heCA9IGkubWF4c1tpXQogICAgCiAgbG9uZ19pbnRyb25zLmludCA8LSBsb25nX2ludHJvbnNbaS5pZCAlaW4lIGxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VfMzVLW3MubGVuPmkubWluICYgcy5sZW48PWkubWF4ICwgIGwuaWRdXQogIHNob3J0X2ludHJvbnMuaW50IDwtIHNob3J0X2ludHJvbnNbaS5pZCAlaW4lIGxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VfMzVLW3MubGVuPmkubWluICYgcy5sZW48PWkubWF4LCBzLmlkXV0KICAKICAKICBsb25nX3Nob3J0LmludC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zLmludFsoIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9ucy5pbnRbKCFHNC4zc3MgJiAhRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9ucy5pbnRbKEc0LjNzcyB8IEc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zLmludFsoRzQuM3NzIHwgRzQuNXNzKSwgXSkgKSkKICAKICAKICBvZGQucmF0aW8gPC0gKGxvbmdfc2hvcnQuaW50LjJ4MlsyLDJdIC8gbG9uZ19zaG9ydC5pbnQuMngyWzIsMV0gKSAvIChsb25nX3Nob3J0LmludC4yeDJbMSwyXSAvIGxvbmdfc2hvcnQuaW50LjJ4MlsxLDFdKQogIGxvbmcuZnJhYyA8LSAgKGxvbmdfc2hvcnQuaW50LjJ4MlsxLDJdIC8gbG9uZ19zaG9ydC5pbnQuMngyWzEsMV0pCiAgc2hvcnQuZnJhYyA8LSAobG9uZ19zaG9ydC5pbnQuMngyWzIsMl0gLyBsb25nX3Nob3J0LmludC4yeDJbMiwxXSApCiAgCiAgcHJpbnQob2RkLnJhdGlvKQogIHByaW50KGNoaXNxLnRlc3QobG9uZ19zaG9ydC5pbnQuMngyKSkKICAKICBzaG9ydF9sb25nLm9kZF9yYXRpb3MgPC0gYyhzaG9ydF9sb25nLm9kZF9yYXRpb3MsIG9kZC5yYXRpbykKICBzaG9ydF9sb25nLnB2YWx1ZXMgPC0gYyhzaG9ydF9sb25nLnB2YWx1ZXMsIGNoaXNxLnRlc3QobG9uZ19zaG9ydC5pbnQuMngyKSRwLnZhbHVlICogbGVuZ3RoKGkubWlucykpCiAgc2hvcnRfbG9uZy5zaG9ydC5mcmFxICA8LSBjKHNob3J0X2xvbmcuc2hvcnQuZnJhcSwgc2hvcnQuZnJhYykKICBzaG9ydF9sb25nLmxvbmcuZnJhcSAgPC0gYyhzaG9ydF9sb25nLmxvbmcuZnJhcSwgbG9uZy5mcmFjKQogIAogIAogIHNob3J0X2xvbmcuR0NzIDwtIHJiaW5kKCBzaG9ydF9sb25nLkdDcywgc2hvcnRfaW50cm9ucy5pbnRbICwgLihpLmlkLCBpLkdDLCBHNCwgdHlwZT0iU2hvcnQiLCAgaS5taW49aS5taW4sIGkubWF4PWkubWF4ICldICkKICBzaG9ydF9sb25nLkdDcyA8LSByYmluZCggc2hvcnRfbG9uZy5HQ3MsIGxvbmdfaW50cm9ucy5pbnRbICwgLihpLmlkLCBpLkdDLCBHNCwgdHlwZT0iTG9uZyIsICBpLm1pbj1pLm1pbiwgaS5tYXg9aS5tYXggKV0gKSAgCiAgfQoKCgoKc2hvcnRfbG9uZy5yZXMgPC0gZGF0YS50YWJsZShzaG9ydF9sb25nLm9kZF9yYXRpb3MsIHNob3J0X2xvbmcucHZhbHVlcywgaS5taW5zLCBpLm1heHMsIHNob3J0X2xvbmcuc2hvcnQuZnJhcSwgc2hvcnRfbG9uZy5sb25nLmZyYXEpCgpzaG9ydF9sb25nLnJlcy5tZWx0IDwtIG1lbHQoc2hvcnRfbG9uZy5yZXMsIGlkPWMoInNob3J0X2xvbmcub2RkX3JhdGlvcyIsInNob3J0X2xvbmcucHZhbHVlcyIsICJpLm1pbnMiLCAiaS5tYXhzIikpCgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApgYGAKCgoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD01fQoKCgpzaG9ydF9sb25nLkdDcyRgSW50cm9uIHR5cGVgIDwtIGZhY3RvcihzaG9ydF9sb25nLkdDcyR0eXBlLCBsZXZlbHM9YygiU2hvcnQiLCAiTG9uZyIpKQoKRmlnMy5zdXAuQiA8LSBnZ3Bsb3Qoc2hvcnRfbG9uZy5HQ3MpICsKICBnZW9tX3Zpb2xpbihhZXMoYXMuZmFjdG9yKGkubWluKSwgaS5HQywgZmlsbD1gSW50cm9uIHR5cGVgKSkgKwogIHhsYWIoIkludHJvbiBzaXplIGludGVydmFsIChudCkiKSArCiAgeWxhYigiR0MgY29udGVudCBwZXJjZW50YWdlIGFmdGVyIGNvcnJlY3Rpb24iKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdCbHVlcycpIAoKYGBgCgoKCgoKYGBge3J9CgoKCnNob3J0X2xvbmcucmVzLm1lbHRbLCBzaWc6PSIiXQpzaG9ydF9sb25nLnJlcy5tZWx0W3Nob3J0X2xvbmcucHZhbHVlcyA8PSAwLjA1ICwgc2lnOj0iKiJdCnNob3J0X2xvbmcucmVzLm1lbHRbc2hvcnRfbG9uZy5wdmFsdWVzIDw9IDAuMDA1ICwgc2lnOj0iKioiXQpzaG9ydF9sb25nLnJlcy5tZWx0W3Nob3J0X2xvbmcucHZhbHVlcyA8PSAwLjAwMCAsIHNpZzo9IioqKiJdCgpzaWdfcm93cyA8LSBzaG9ydF9sb25nLnJlcy5tZWx0W3ZhcmlhYmxlPT0ic2hvcnRfbG9uZy5zaG9ydC5mcmFxIiAmIHNpZyE9IiIsIHdoaWNoID0gVFJVRV0Kc2lnX2Fubm8gPC0gc2hvcnRfbG9uZy5yZXMubWVsdFt2YXJpYWJsZT09InNob3J0X2xvbmcuc2hvcnQuZnJhcSIgJiBzaWchPSIiLCBzaWddCgpGaWczLkMubmV3IDwtICBnZ3Bsb3Qoc2hvcnRfbG9uZy5yZXMubWVsdCwgYWVzKGFzLmZhY3RvcihpLm1pbnMpLCB2YWx1ZSkpICsKICBnZW9tX2JhcihhZXMoIGdyb3VwPXZhcmlhYmxlLCBmaWxsPXZhcmlhYmxlKSwgcG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9zaWduaWYoIHlfcG9zaXRpb249MC4zLCB4bWluPXNpZ19yb3dzLTAuMTUsIHhtYXg9c2lnX3Jvd3MrMC4xNSwgYW5ub3RhdGlvbj1zaWdfYW5ubywgdGlwX2xlbmd0aD0wKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIkludHJvbiB0eXBlIiwgbGFiZWxzID0gYygiU2hvcnQiLCAiTG9uZyIpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdCbHVlcycpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKRmlnMy5DLm5ldwoKYGBgCgoKCgoKCgoKIyMgRXhvbiBudW1iZXIKCgpIZXJlIHdlIGV4cGxvcmVkIGhvdyBHNCBlbnJpY2htZW50cyBjaGFuZ2UgdGhvcnVnaCBnZW5lIGJvZHkKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zXzFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMS5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18xLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18xLnVwX3BsdXMsIGV4b25zXzEudXBfbWludXMsIGV4b25zXzEuZG93bl9wbHVzLCBleG9uc18xLmRvd25fbWludXMpIAoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18yLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMl9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18yLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzIudXBfcGx1cywgZXhvbnNfMi51cF9taW51cywgZXhvbnNfMi5kb3duX3BsdXMsIGV4b25zXzIuZG93bl9taW51cykgCgpgYGAKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgoKZXhvbnNfMy51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zXzNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMy5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18zLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18zLnVwX3BsdXMsIGV4b25zXzMudXBfbWludXMsIGV4b25zXzMuZG93bl9wbHVzLCBleG9uc18zLmRvd25fbWludXMpIAoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc180LnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfNF9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc180LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzQudXBfcGx1cywgZXhvbnNfNC51cF9taW51cywgZXhvbnNfNC5kb3duX3BsdXMsIGV4b25zXzQuZG93bl9taW51cykgCgpgYGAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taWRkbGUudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taWRkbGVfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taWRkbGUuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWlkZGxlLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taWRkbGUudXBfcGx1cywgZXhvbnNfbWlkZGxlLnVwX21pbnVzLCBleG9uc19taWRkbGUuZG93bl9wbHVzLCBleG9uc19taWRkbGUuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCmV4b25zX21pbnVzNC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzNC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzNC51cF9wbHVzLCBleG9uc19taW51czQudXBfbWludXMsIGV4b25zX21pbnVzNC5kb3duX3BsdXMsIGV4b25zX21pbnVzNC5kb3duX21pbnVzKSAKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taW51czMudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taW51czNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czMuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMzLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czMudXBfcGx1cywgZXhvbnNfbWludXMzLnVwX21pbnVzLCBleG9uc19taW51czMuZG93bl9wbHVzLCBleG9uc19taW51czMuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCmV4b25zX21pbnVzMi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMi51cF9wbHVzLCBleG9uc19taW51czIudXBfbWludXMsIGV4b25zX21pbnVzMi5kb3duX3BsdXMsIGV4b25zX21pbnVzMi5kb3duX21pbnVzKSAKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taW51czEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taW51czFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMxLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czEudXBfcGx1cywgZXhvbnNfbWludXMxLnVwX21pbnVzLCBleG9uc19taW51czEuZG93bl9wbHVzLCBleG9uc19taW51czEuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE1fQpleG9uc18xLlRPVEFMWywgZXhvbl9udW06PSIxIl0KZXhvbnNfMi5UT1RBTFssIGV4b25fbnVtOj0iMiJdCmV4b25zXzMuVE9UQUxbLCBleG9uX251bTo9IjMiXQpleG9uc180LlRPVEFMWywgZXhvbl9udW06PSI0Il0KCmV4b25zX21pZGRsZS5UT1RBTFssIGV4b25fbnVtOj0ibWlkZGxlIl0KCmV4b25zX21pbnVzNC5UT1RBTFssIGV4b25fbnVtOj0iLTQiXQpleG9uc19taW51czMuVE9UQUxbLCBleG9uX251bTo9Ii0zIl0KZXhvbnNfbWludXMyLlRPVEFMWywgZXhvbl9udW06PSItMiJdCmV4b25zX21pbnVzMS5UT1RBTFssIGV4b25fbnVtOj0iLTEiXQoKCmV4b25fbnVtLlRPVEFMIDwtIHJiaW5kKGV4b25zXzEuVE9UQUwsIGV4b25zXzIuVE9UQUwsIGV4b25zXzMuVE9UQUwsIGV4b25zXzQuVE9UQUwsIGV4b25zX21pZGRsZS5UT1RBTCwgZXhvbnNfbWludXM0LlRPVEFMLCBleG9uc19taW51czMuVE9UQUwsIGV4b25zX21pbnVzMi5UT1RBTCwgZXhvbnNfbWludXMxLlRPVEFMKQoKCmV4b25fbnVtLlRPVEFMJGV4b25fbnVtIDwtIGZhY3RvcihleG9uX251bS5UT1RBTCRleG9uX251bSwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIsICJtaWRkbGUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiICkpCgpGaWczLnN1cC5DIDwtIGdncGxvdChleG9uX251bS5UT1RBTCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIHhsaW0oYygtMzAwLDMwMCkpICsKICAgIGZhY2V0X2dyaWQoIGV4b25fcG9zIH4gZXhvbl9udW0gICApICsKICB0aGVtZV9idygpCgpGaWczLnN1cC5DCgpgYGAKCgoKCgojIyBFeG9uIG51bWJlcnMgYnkgc3RyYXRuZHMgIyMKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zXzEudXBfcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLmRvd25fbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzEuZG93bl9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfMS5UT1RBTC5udCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfMS51cF9wbHVzLm50LCBleG9uc18xLnVwX21pbnVzLm50LCBleG9uc18xLmRvd25fcGx1cy5udCwgZXhvbnNfMS5kb3duX21pbnVzLm50KSAKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18xLnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18xX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMS5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzEuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfMS51cF9wbHVzLnQsIGV4b25zXzEudXBfbWludXMudCwgZXhvbnNfMS5kb3duX3BsdXMudCwgZXhvbnNfMS5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfMS5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18yLnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzJfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzJfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18yLmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzIuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzIudXBfcGx1cy5udCwgZXhvbnNfMi51cF9taW51cy5udCwgZXhvbnNfMi5kb3duX3BsdXMubnQsIGV4b25zXzIuZG93bl9taW51cy5udCkgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMi51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzJfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzJfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzIuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18yLlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzIudXBfcGx1cy50LCBleG9uc18yLnVwX21pbnVzLnQsIGV4b25zXzIuZG93bl9wbHVzLnQsIGV4b25zXzIuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zXzIuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zXzMudXBfcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfM19taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLmRvd25fbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzMuZG93bl9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfMy5UT1RBTC5udCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfMy51cF9wbHVzLm50LCBleG9uc18zLnVwX21pbnVzLm50LCBleG9uc18zLmRvd25fcGx1cy5udCwgZXhvbnNfMy5kb3duX21pbnVzLm50KSAKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18zLnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfM19taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18zX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMy5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzMuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfMy51cF9wbHVzLnQsIGV4b25zXzMudXBfbWludXMudCwgZXhvbnNfMy5kb3duX3BsdXMudCwgZXhvbnNfMy5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfMy5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc180LnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzRfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzRfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc180LmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzQuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzQudXBfcGx1cy5udCwgZXhvbnNfNC51cF9taW51cy5udCwgZXhvbnNfNC5kb3duX3BsdXMubnQsIGV4b25zXzQuZG93bl9taW51cy5udCkgCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zXzQudXBfcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC51cF9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC5kb3duX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzRfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc180LmRvd25fbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfNC5UT1RBTC50IDwtIHBsb3RfZGVuc2l0eShleG9uc180LnVwX3BsdXMudCwgZXhvbnNfNC51cF9taW51cy50LCBleG9uc180LmRvd25fcGx1cy50LCBleG9uc180LmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc180LlRPVEFMLnQpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB5bGltKGMoMCw2KSkgKwogICAgdGhlbWVfYncoKQoKYGBgCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWlkZGxlLnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLmRvd25fcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS51cF9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taWRkbGVfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWlkZGxlLmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pZGRsZS5UT1RBTC5udCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWlkZGxlLnVwX3BsdXMubnQsIGV4b25zX21pZGRsZS51cF9taW51cy5udCwgZXhvbnNfbWlkZGxlLmRvd25fcGx1cy5udCwgZXhvbnNfbWlkZGxlLmRvd25fbWludXMubnQpIAoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pZGRsZS51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taWRkbGUuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taWRkbGUuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWlkZGxlLnVwX3BsdXMudCwgZXhvbnNfbWlkZGxlLnVwX21pbnVzLnQsIGV4b25zX21pZGRsZS5kb3duX3BsdXMudCwgZXhvbnNfbWlkZGxlLmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc19taWRkbGUuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWludXM0LnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LmRvd25fcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXM0X3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC51cF9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czQudXBfbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWludXM0LmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pbnVzNC5UT1RBTC5udCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWludXM0LnVwX3BsdXMubnQsIGV4b25zX21pbnVzNC51cF9taW51cy5udCwgZXhvbnNfbWludXM0LmRvd25fcGx1cy5udCwgZXhvbnNfbWludXM0LmRvd25fbWludXMubnQpIAoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taW51czQudXBfcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czQuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWludXM0LmRvd25fbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXM0LlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzNC51cF9wbHVzLnQsIGV4b25zX21pbnVzNC51cF9taW51cy50LCBleG9uc19taW51czQuZG93bl9wbHVzLnQsIGV4b25zX21pbnVzNC5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfbWludXM0LlRPVEFMLnQpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB5bGltKGMoMCw2KSkgKwogICAgdGhlbWVfYncoKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzMy51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzM19wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMy5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czMuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMy51cF9wbHVzLm50LCBleG9uc19taW51czMudXBfbWludXMubnQsIGV4b25zX21pbnVzMy5kb3duX3BsdXMubnQsIGV4b25zX21pbnVzMy5kb3duX21pbnVzLm50KSAKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWludXMzLnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMy5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pbnVzMy5UT1RBTC50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czMudXBfcGx1cy50LCBleG9uc19taW51czMudXBfbWludXMudCwgZXhvbnNfbWludXMzLmRvd25fcGx1cy50LCBleG9uc19taW51czMuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zX21pbnVzMy5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taW51czIudXBfcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czJfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czJfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLmRvd25fbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czIuZG93bl9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMyLlRPVEFMLm50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czIudXBfcGx1cy5udCwgZXhvbnNfbWludXMyLnVwX21pbnVzLm50LCBleG9uc19taW51czIuZG93bl9wbHVzLm50LCBleG9uc19taW51czIuZG93bl9taW51cy5udCkgCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzMi51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czIuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czIuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWludXMyLnVwX3BsdXMudCwgZXhvbnNfbWludXMyLnVwX21pbnVzLnQsIGV4b25zX21pbnVzMi5kb3duX3BsdXMudCwgZXhvbnNfbWludXMyLmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc19taW51czIuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzMS51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMV9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMxLnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMS5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czEuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMS51cF9wbHVzLm50LCBleG9uc19taW51czEudXBfbWludXMubnQsIGV4b25zX21pbnVzMS5kb3duX3BsdXMubnQsIGV4b25zX21pbnVzMS5kb3duX21pbnVzLm50KSAKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWludXMxLnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMxLmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMS5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pbnVzMS5UT1RBTC50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czEudXBfcGx1cy50LCBleG9uc19taW51czEudXBfbWludXMudCwgZXhvbnNfbWludXMxLmRvd25fcGx1cy50LCBleG9uc19taW51czEuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zX21pbnVzMS5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xNX0KZXhvbnNfMS5UT1RBTC5udFssIGV4b25fbnVtOj0iMSJdCmV4b25zXzIuVE9UQUwubnRbLCBleG9uX251bTo9IjIiXQpleG9uc18zLlRPVEFMLm50WywgZXhvbl9udW06PSIzIl0KZXhvbnNfNC5UT1RBTC5udFssIGV4b25fbnVtOj0iNCJdCgpleG9uc19taWRkbGUuVE9UQUwubnRbLCBleG9uX251bTo9Im1pZGRsZSJdCgpleG9uc19taW51czQuVE9UQUwubnRbLCBleG9uX251bTo9Ii00Il0KZXhvbnNfbWludXMzLlRPVEFMLm50WywgZXhvbl9udW06PSItMyJdCmV4b25zX21pbnVzMi5UT1RBTC5udFssIGV4b25fbnVtOj0iLTIiXQpleG9uc19taW51czEuVE9UQUwubnRbLCBleG9uX251bTo9Ii0xIl0KCgpleG9uX251bS5UT1RBTC5udCA8LSByYmluZChleG9uc18xLlRPVEFMLm50LCBleG9uc18yLlRPVEFMLm50LCBleG9uc18zLlRPVEFMLm50LCBleG9uc180LlRPVEFMLm50LCBleG9uc19taWRkbGUuVE9UQUwubnQsIGV4b25zX21pbnVzNC5UT1RBTC5udCwgZXhvbnNfbWludXMzLlRPVEFMLm50LCBleG9uc19taW51czIuVE9UQUwubnQsIGV4b25zX21pbnVzMS5UT1RBTC5udCkKCgoKCmV4b25zXzEuVE9UQUwudFssIGV4b25fbnVtOj0iMSJdCmV4b25zXzIuVE9UQUwudFssIGV4b25fbnVtOj0iMiJdCmV4b25zXzMuVE9UQUwudFssIGV4b25fbnVtOj0iMyJdCmV4b25zXzQuVE9UQUwudFssIGV4b25fbnVtOj0iNCJdCgpleG9uc19taWRkbGUuVE9UQUwudFssIGV4b25fbnVtOj0ibWlkZGxlIl0KCmV4b25zX21pbnVzNC5UT1RBTC50WywgZXhvbl9udW06PSItNCJdCmV4b25zX21pbnVzMy5UT1RBTC50WywgZXhvbl9udW06PSItMyJdCmV4b25zX21pbnVzMi5UT1RBTC50WywgZXhvbl9udW06PSItMiJdCmV4b25zX21pbnVzMS5UT1RBTC50WywgZXhvbl9udW06PSItMSJdCgoKCgoKZXhvbl9udW0uVE9UQUwudCA8LSByYmluZChleG9uc18xLlRPVEFMLnQsIGV4b25zXzIuVE9UQUwudCwgZXhvbnNfMy5UT1RBTC50LCBleG9uc180LlRPVEFMLnQsIGV4b25zX21pZGRsZS5UT1RBTC50LCBleG9uc19taW51czQuVE9UQUwudCwgZXhvbnNfbWludXMzLlRPVEFMLnQsIGV4b25zX21pbnVzMi5UT1RBTC50LCBleG9uc19taW51czEuVE9UQUwudCkKCgpleG9uX251bS5UT1RBTC5udFssIHN0cmFuZDo9Ik5vbl90ZW1wbGF0ZSJdCmV4b25fbnVtLlRPVEFMLnRbLCBzdHJhbmQ6PSJUZW1wbGF0ZSJdCgoKZXhvbl9udW0uVE9UQUwudG50IDwtIHJiaW5kKGV4b25fbnVtLlRPVEFMLm50LCBleG9uX251bS5UT1RBTC50KQpleG9uX251bS5UT1RBTC50bnQkZXhvbl9udW0gPC0gZmFjdG9yKGV4b25fbnVtLlRPVEFMLnRudCRleG9uX251bSwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIsICJtaWRkbGUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiICkpCgoKCmV4b25fbnVtLlRPVEFMLnRudFtleG9uX251bT09Im1pZGRsZSIsIFRvdGFsX2V4b25zOj0oNDM5MjUgKyA0MzcyOSkgXQpleG9uX251bS5UT1RBTC50bnRbZXhvbl9udW0hPSJtaWRkbGUiLCBUb3RhbF9leG9uczo9KDQ3NDUgKyA0NTY5KSBdCgoKZXhvbl9udW0uVE9UQUwudG50LmJpbm9taWFsIDwtIGNiaW5kKGV4b25fbnVtLlRPVEFMLnRudCwgIGV4b25fbnVtLlRPVEFMLnRudFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIFRvdGFsX2V4b25zKSBdKQoKCgpleG9uX251bS5UT1RBTC50bnQuYmlub21pYWxbLCBtZWRpYW46PU5VTExdCgpleG9uX251bS5UT1RBTC50bnQuYmlub21pYWxbICwgbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpLCBieT1jKCJleG9uX3BvcyIsICJzdHJhbmQiLCAiZXhvbl9udW0iICldCmV4b25fbnVtLlRPVEFMLnRudC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCkZpZzMuRC5uZXcgPC1nZ3Bsb3QoZXhvbl9udW0uVE9UQUwudG50LmJpbm9taWFsKSsKICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbiwgZmlsbD1zdHJhbmQsIHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91KSwgYWxwaGE9MC4zKSArCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPXN0cmFuZCkpICsKICAgIHhsaW0oYygtMzAwLDMwMCkpICsKICAgIGZhY2V0X2dyaWQoIGV4b25fcG9zIH4gZXhvbl9udW0gICApICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKCkZpZzMuRC5uZXcKCgpgYGAKCgoKCiMgRzQgc2VxCgoKSGVyZSB3ZSBkaXN0cmlidXRpb24gb2YgRzQtc2VxIGV4cGVyaW1lbnRzICAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkc0XzIwMTkuSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5LLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTkuSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LksuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkuSy5RMV91cF9wbHVzLCBHNF8yMDE5LksuUTJfdXBfcGx1cywgRzRfMjAxOS5LLlEzX3VwX3BsdXMsIEc0XzIwMTkuSy5RNF91cF9wbHVzKQpHNF8yMDE5LksuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkuSy5RMV91cF9taW51cywgRzRfMjAxOS5LLlEyX3VwX21pbnVzLCBHNF8yMDE5LksuUTNfdXBfbWludXMsIEc0XzIwMTkuSy5RNF91cF9taW51cykKRzRfMjAxOS5LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5LLlExX2Rvd25fcGx1cywgRzRfMjAxOS5LLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5LLlEzX2Rvd25fcGx1cywgRzRfMjAxOS5LLlE0X2Rvd25fcGx1cykKRzRfMjAxOS5LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkuSy5RMV9kb3duX21pbnVzLCBHNF8yMDE5LksuUTJfZG93bl9taW51cywgRzRfMjAxOS5LLlEzX2Rvd25fbWludXMsIEc0XzIwMTkuSy5RNF9kb3duX21pbnVzKQpHNF8yMDE5Lksud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkuSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxOS5LLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkuSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5LLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxOS5LLndpbmRvd19sZW4pCgoKZ2dwbG90KEc0XzIwMTkuSy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzRfMjAxOS5QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5QRFMuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE5LlBEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkuUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5QRFMuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS5QRFMuUTFfdXBfcGx1cywgRzRfMjAxOS5QRFMuUTJfdXBfcGx1cywgRzRfMjAxOS5QRFMuUTNfdXBfcGx1cywgRzRfMjAxOS5QRFMuUTRfdXBfcGx1cykKRzRfMjAxOS5QRFMuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX3VwX21pbnVzLCBHNF8yMDE5LlBEUy5RMl91cF9taW51cywgRzRfMjAxOS5QRFMuUTNfdXBfbWludXMsIEc0XzIwMTkuUERTLlE0X3VwX21pbnVzKQpHNF8yMDE5LlBEUy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX2Rvd25fcGx1cywgRzRfMjAxOS5QRFMuUTJfZG93bl9wbHVzLCBHNF8yMDE5LlBEUy5RM19kb3duX3BsdXMsIEc0XzIwMTkuUERTLlE0X2Rvd25fcGx1cykKRzRfMjAxOS5QRFMuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5QRFMuUTFfZG93bl9taW51cywgRzRfMjAxOS5QRFMuUTJfZG93bl9taW51cywgRzRfMjAxOS5QRFMuUTNfZG93bl9taW51cywgRzRfMjAxOS5QRFMuUTRfZG93bl9taW51cykKRzRfMjAxOS5QRFMud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkuUERTLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LlBEUy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkuUERTLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkuUERTLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LlBEUy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkuUERTLndpbmRvd19sZW4pCgoKZ2dwbG90KEc0XzIwMTkuUERTLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKSArIAogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCgpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCmBgYAoKCgpgYGB7cn0KRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl91cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX21pbnVzKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfZG93bl9taW51cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuUERTLndpbmRvd19sZW4pCmBgYAoKCgpgYGB7cn0KRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV91cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF91cF9wbHVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV91cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTNfdXBfbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF91cF9taW51cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV9kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF9kb3duX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLndpbmRvd19sZW4pCmBgYAoKCmBgYHtyfQoKCgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwgPC0gcmJpbmQoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMudG90YWwsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCkKICAKaGFsZl9uIDwtIG5yb3coRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsKS8yCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbFssIFN0cmFuZDo9cmVwKGMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIAogIApHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKYGBge3J9CgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQoKCmdncGxvdChHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCgpgYGAKCgoKYGBge3J9Ckc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbFtTdHJhbmQ9PSJOb24tdGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9IlRlbXBsYXRlIl0KRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsW1N0cmFuZD09IlRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJOb24tdGVtcGxhdGUiXQoKCiAgCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRuZXdfU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJG5ld19TdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgpnZ3Bsb3QoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIG5ld19TdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpgYGAKCgoKCgoKCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKCkc0XzIwMTkudGVtcGxhdGUuSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgpgYGAKCgoKYGBge3J9Ckc0XzIwMTkudGVtcGxhdGUuSy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLksuUTFfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RM191cF9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTRfdXBfcGx1cykKRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLksuUTFfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl91cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTRfdXBfbWludXMpCkc0XzIwMTkudGVtcGxhdGUuSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuSy5RMV9kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl9kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RM19kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RNF9kb3duX3BsdXMpCkc0XzIwMTkudGVtcGxhdGUuSy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RM19kb3duX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9taW51cykKRzRfMjAxOS50ZW1wbGF0ZS5LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5LnRlbXBsYXRlLksuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTkudGVtcGxhdGUuSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuSy5Rcy5taW51cy5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuSy53aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV91cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTNfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF91cF9wbHVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlExX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlE0X3VwX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV9kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfZG93bl9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF9kb3duX3BsdXMpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV9kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTNfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF9kb3duX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5taW51cy5saXN0LCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy53aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCkc0XzIwMTkudGVtcGxhdGUuSy5Rcy50b3RhbApHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsCgoKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCA8LSByYmluZChHNF8yMDE5LnRlbXBsYXRlLksuUXMudG90YWwsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMudG90YWwpCiAgCmhhbGZfbiA8LSBucm93KEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwpLzIKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbFssIFN0cmFuZDo9cmVwKGMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIAogIApHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFN0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgoKCgpgYGB7cn0KCgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFEgPC0gbWFwdmFsdWVzKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWxbU3RyYW5kPT0iTm9uLXRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJUZW1wbGF0ZSJdCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWxbU3RyYW5kPT0iVGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9Ik5vbi10ZW1wbGF0ZSJdCgoKCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwkbmV3X1N0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwkbmV3X1N0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCmdncGxvdChHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIG5ld19TdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKYGBgCgoKCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMyMDE1CgpHNF8yMDE1Lk5hX1BEUy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX1BEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUuTmFfUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgoKCkc0XzIwMTUuTmFfUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfUERTLlExX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEyX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEzX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlE0X3VwX3BsdXMpCkc0XzIwMTUuTmFfUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV91cF9taW51cywgRzRfMjAxNS5OYV9QRFMuUTJfdXBfbWludXMsIEc0XzIwMTUuTmFfUERTLlEzX3VwX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RNF91cF9taW51cykKRzRfMjAxNS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTUuTmFfUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1Lk5hX1BEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS5OYV9QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE1Lk5hX1BEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE1Lk5hX1BEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1Lk5hX1BEUy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE1Lk5hX1BEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ckc0XzIwMTUuTmFfSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5OYV9LLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUuTmFfSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUuTmFfSy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKCgpHNF8yMDE1Lk5hX0suUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9LLlExX3VwX3BsdXMsIEc0XzIwMTUuTmFfSy5RMl91cF9wbHVzLCBHNF8yMDE1Lk5hX0suUTNfdXBfcGx1cywgRzRfMjAxNS5OYV9LLlE0X3VwX3BsdXMpCkc0XzIwMTUuTmFfSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9LLlExX3VwX21pbnVzLCBHNF8yMDE1Lk5hX0suUTJfdXBfbWludXMsIEc0XzIwMTUuTmFfSy5RM191cF9taW51cywgRzRfMjAxNS5OYV9LLlE0X3VwX21pbnVzKQpHNF8yMDE1Lk5hX0suUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX0suUTFfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX0suUTJfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX0suUTNfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX0suUTRfZG93bl9wbHVzKQpHNF8yMDE1Lk5hX0suUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9LLlExX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfSy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lk5hX0suUTNfZG93bl9taW51cywgRzRfMjAxNS5OYV9LLlE0X2Rvd25fbWludXMpCkc0XzIwMTUuTmFfSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5OYV9LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE1Lk5hX0suUXMucGx1cy51cC5saXN0LCBHNF8yMDE1Lk5hX0suUXMubWludXMubGlzdCwgRzRfMjAxNS5OYV9LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE1Lk5hX0suUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1Lk5hX0sud2luZG93X2xlbikKCgpnZ3Bsb3QoRzRfMjAxNS5OYV9LLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKSArIAogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpgYGAKCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgoKCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgpgYGAKCgoKYGBge3J9Ckc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X3VwX3BsdXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV91cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTJfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF91cF9taW51cykKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM191cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfcGx1cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl91cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM19kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9taW51cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbAoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCA8LSByYmluZChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwpLzIKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsWywgU3RyYW5kOj1yZXAoYygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgCiAgCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgpgYGB7cn0KCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWxbU3RyYW5kPT0iTm9uLXRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJUZW1wbGF0ZSJdCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbFtTdHJhbmQ9PSJUZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iTm9uLXRlbXBsYXRlIl0KCgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkbmV3X1N0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCmdncGxvdChHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTMwMCwzMDApKSArCiAgZmFjZXRfZ3JpZCggbmV3X1N0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpgYGAKCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgpgYGAKCgoKYGBge3J9Ckc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfdXBfcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM191cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfdXBfcGx1cykKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl91cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfdXBfbWludXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV9kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl9kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM19kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF9kb3duX3BsdXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfZG93bl9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM19kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfZG93bl9taW51cykKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5taW51cy5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy53aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV91cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF91cF9wbHVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlExX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlE0X3VwX21pbnVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV9kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTJfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF9kb3duX3BsdXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV9kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF9kb3duX21pbnVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5taW51cy5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy53aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy50b3RhbApHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsCgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCA8LSByYmluZChHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMudG90YWwsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwpCiAgCmhhbGZfbiA8LSBucm93KEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwpLzIKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbFssIFN0cmFuZDo9cmVwKGMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIAogIApHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJFN0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgpgYGB7cn0KCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJFEgPC0gbWFwdmFsdWVzKEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWxbU3RyYW5kPT0iTm9uLXRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJUZW1wbGF0ZSJdCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWxbU3RyYW5kPT0iVGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9Ik5vbi10ZW1wbGF0ZSJdCgoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkbmV3X1N0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkbmV3X1N0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCmdncGxvdChHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0zMDAsMzAwKSkgKwogIGZhY2V0X2dyaWQoIG5ld19TdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKYGBgCgoKCgojIEtDbCBSTkEtc2VxCgoKQXMgSysgaXMga25vd24gdG8gc3RhYmlsaXplIEc0LCB3ZSBhbmFsaXplZCAoUk5BLXNlcSBkYXRhKVtodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2Jpb3Byb2plY3QvUFJKRUIxOTQ1MV0gY29tbWluZyBmcm9tIG5ldXJvbnMgYWZ0ZXIgNC1ob3VyIEtDbC1pbmR1c2VkIGRlcG9sYXJpemF0aW9uLiAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKS0NMX2h1bWFuX3Vwc3RyZWFtIDwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9Db250cm9sX3ZzX0tDTC5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIgICkgCgpLQ0xfaHVtYW5fdXBzdHJlYW0gPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiAgKSAjc3RvcCBoZXJlCmNvbG5hbWVzKEtDTF9odW1hbl91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfaHVtYW5fZG93bnN0cmVhbTwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQpjb2xuYW1lcyhLQ0xfaHVtYW5fZG93bnN0cmVhbSkgPC1jKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF9odW1hbiA8LSAgbWVyZ2UoS0NMX2h1bWFuX3Vwc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgIlBzaV9BIiwgIlBzaV9CIiwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX2h1bWFuX2Rvd25zdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAiUHNpX0EiLCAiUHNpX0IiLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgIlBzaV9BIiwgIlBzaV9CIiwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCktDTF9odW1hblsoRzQueD4wIHwgRzQueT4wICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX2h1bWFuWyhHNC54PT0wICYgRzQueT09MCApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF9odW1hbiRHNF9ib2wgPC0gZmFjdG9yKEtDTF9odW1hbiRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfaHVtYW5bZW5kIC0gc3RhcnQgPiAzMCwgZXhvbjo9ImV4b24iIF0KS0NMX2h1bWFuW2VuZCAtIHN0YXJ0IDw9IDMwLCBleG9uOj0ibWljcm9leG9uIiBdCgpzaXplLnZhcj0wLjUKYWxwaGEudmFyPTAuMjUKCiBnZ3Bsb3QoZGF0YT1LQ0xfaHVtYW5bIFR5cGU9PSJDRSIsXSkgKwogIGdlb21fcG9pbnQoIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iZ3JleSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJza3libHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPCgtMC4xKSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJyZWQiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICB4bGltKGMoLTAuOCwgMC44KSkgKwogIGZhY2V0X2dyaWQoIC4gfiBHNF9ib2wgICkgKwogIHhsYWIoIkRlbHRhUFNJIChDb250cm9sIC0gS0NsKSIpICsKICB0aGVtZV9idygpCgoKCgpgYGAKCgpUbyBoaWdobGlnaHQgTlJYTjIsIFNIQU5LMSBhbmQgUkJNMTAgd2UgdXNlZCBiaW9tYVJ0IHRvIGZpbmQgdGhlIGdlbmUgbmFtZSB0byBFbnNlbWJsIElEIGNvcnJlc3BvbmRlbmNlIAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShiaW9tYVJ0KQoKZW5zZW1ibCA9IHVzZUVuc2VtYmwoYmlvbWFydD0iZW5zZW1ibCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCgoKCgoKCgpLQ0xfaHVtYW5bIFR5cGU9PSJDRSImIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgIF0KCgpLQ0xfaHVtYW5bLCBDb29yZHM6PXBhc3RlKGNocm9tLCBwYXN0ZShzdGFydCwgZW5kLCBzZXAgPSAiLSIpLCBzdHJhbmQsIHNlcD0iOiIgKV0KCgp3aGlwcGV0Lmpscy5leG9ucy5oZzE5IDwtICBmcmVhZCgiLi4vS0NML3doaXBwZXQuamxzLmV4b25zLnRhYiIpCgpLQ0xfaHVtYW5fQ0UgPC0gbWVyZ2UoS0NMX2h1bWFuW1R5cGU9PSJDRSIsIF0sIHdoaXBwZXQuamxzLmV4b25zLmhnMTksIGJ5Lng9IkNvb3JkcyIsIGJ5Lnk9IlBvdGVudGlhbF9FeG9uIikKCgpLQ0xfaHVtYW5fQ0VbICwgZW5zZW1ibF9nZW5lX2lkOj12YXBwbHkoc3Ryc3BsaXQoS0NMX2h1bWFuX0NFJEdlbmUsICIuIiwgZml4ZWQgPSBUUlVFKSwgIlsiLCAiIiwgMSldCgpLQ0xfaHVtYW5fQ0VfZ2VuZXMgPC0gIGRhdGEudGFibGUoZ2V0Qk0oYXR0cmlidXRlcz1jKCdlbnNlbWJsX2dlbmVfaWQnLCAid2lraWdlbmVfZGVzY3JpcHRpb24iLCAiaGduY19zeW1ib2wiKSxmaWx0ZXJzID0gJ2Vuc2VtYmxfZ2VuZV9pZCcsIHZhbHVlcyA9IHVuaXF1ZSh2YXBwbHkoc3Ryc3BsaXQoS0NMX2h1bWFuX0NFJEdlbmUsICIuIiwgZml4ZWQgPSBUUlVFKSwgIlsiLCAiIiwgMSkpICwgbWFydCA9IGVuc2VtYmwpKQoKCktDTF9odW1hbl9DRSA8LSAgbWVyZ2UoS0NMX2h1bWFuX0NFLCBLQ0xfaHVtYW5fQ0VfZ2VuZXMsIGJ5PSJlbnNlbWJsX2dlbmVfaWQiKQoKCgoKCgoKCgoKCktDTF9odW1hbl9DRVsgaGduY19zeW1ib2w9PSJHUklOMSIsICBdWyBUeXBlPT0iQ0UiJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjg1LCAgXQoKS0NMX2h1bWFuX0NFWyBoZ25jX3N5bWJvbD09Ik5SWE4yIiwgIF1bIFR5cGU9PSJDRSImIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgIF0KS0NMX2h1bWFuX0NFWyBoZ25jX3N5bWJvbD09IlNIQU5LMSIsICBdWyBUeXBlPT0iQ0UiJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjg1LCAgXQpLQ0xfaHVtYW5fQ0VbIGhnbmNfc3ltYm9sPT0iUkJNMTAiLCAgXVsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCAgXQoKCgoKCiAgCgoKCmBgYAoKCmBgYHtyfQpLQ0xfaHVtYW5fQ0VbIFR5cGU9PSJDRSImIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgIF0KYGBgCgoKCiMjIyBNaWNyb2V4b25zCmBgYHtyfQpsaWJyYXJ5KHRpZHlyKQoKClRPVEFMX01FX3N0YXRzIDwtIGZ1bmN0aW9uKEtDTF9odW1hbil7CgpLQ0xfaHVtYW5bICAsIGRpZmY6PSJOQSJdCktDTF9odW1hblsgKERlbHRhUHNpPD0tMC4xICYgUHJvYmFiaWxpdHk+PTAuOSkgLCBkaWZmOj0iSW4iXQpLQ0xfaHVtYW5bIChEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT49MC45KSAsIGRpZmY6PSJFeCJdCiAgCiAgCktDTF9odW1hbi5UT1RBTF9hbmRfTUUgPC0gc2VwYXJhdGUoS0NMX2h1bWFuLGNvbCA9ICJDb29yZCIsaW50byA9IGMoImNocm9tIiwgInN0YXJ0X2VuZCIpLCBzZXAgPSAiOiIpCktDTF9odW1hbi5UT1RBTF9hbmRfTUUgPC0gc2VwYXJhdGUoS0NMX2h1bWFuLlRPVEFMX2FuZF9NRSxjb2wgPSAic3RhcnRfZW5kIiwgaW50byA9IGMoInN0YXJ0IiwgImVuZCIpLCBzZXAgPSAiLSIpCgoKS0NMX2h1bWFuLlRPVEFMX2FuZF9NRSA8LSBLQ0xfaHVtYW4uVE9UQUxfYW5kX01FW1R5cGU9PSJDRSIsIF0KCktDTF9odW1hbi5UT1RBTF9hbmRfTUVbICwgIGV4b25fdHlwZTo9IkV4b24iXQpLQ0xfaHVtYW4uVE9UQUxfYW5kX01FWygoYXMubnVtZXJpYyhlbmQpLWFzLm51bWVyaWMoc3RhcnQpKTw9MzApLCBleG9uX3R5cGU6PSJNaWNyb2V4b24iIF0KCnRhYmxlKEtDTF9odW1hbi5UT1RBTF9hbmRfTUVbICBleG9uX3R5cGU9PSJNaWNyb2V4b24iLCBkaWZmXSkKCgpLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzIDwtIEtDTF9odW1hbi5UT1RBTF9hbmRfTUVbLCAuTiwgYnk9YygiZGlmZiIsICJleG9uX3R5cGUiKV0KS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0c1ssIHRvdGFsOj1zdW0oTiksIGJ5PWV4b25fdHlwZV0KS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0c1ssIFBlcmNlbnQ6PShOL3RvdGFsKSoxMDBdCgpyZXR1cm4oS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0cykKCn0KCgpLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzIDwtIFRPVEFMX01FX3N0YXRzKEtDTF9odW1hbikgCgpnZ3Bsb3QoS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0czJbZGlmZiE9Ik5BIl0gKSArCiAgZ2VvbV9iYXIoIGFlcyggZXhvbl90eXBlLCBQZXJjZW50LCBmaWxsPWRpZmYpLCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIgICkKYGBgCgoKCmBgYHtyfQoKCgpNRV9UT1RBTF9jaGlfc3F1YXJlZCA8LSBmdW5jdGlvbihLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzKXsKCgpLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzLm1hdHJpeCA8LQoKbWF0cml4KGNiaW5kKApLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzWyBkaWZmIT0iTkEiLCBzdW0oTiksIGJ5PSJleG9uX3R5cGUiIF1bIGV4b25fdHlwZT09Ik1pY3JvZXhvbiIsIFYxIF0sCktDTF9odW1hbi5UT1RBTF9hbmRfTUVfc3RhdHNbIGRpZmYhPSJOQSIsIHN1bShOKSwgYnk9ImV4b25fdHlwZSIgXVsgZXhvbl90eXBlPT0iRXhvbiIsIFYxIF0sCgpLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzWyBkaWZmPT0iTkEiLCBzdW0oTiksIGJ5PSJleG9uX3R5cGUiIF1bIGV4b25fdHlwZT09Ik1pY3JvZXhvbiIsIFYxIF0sCktDTF9odW1hbi5UT1RBTF9hbmRfTUVfc3RhdHNbIGRpZmY9PSJOQSIsIHN1bShOKSwgYnk9ImV4b25fdHlwZSIgXVsgZXhvbl90eXBlPT0iRXhvbiIsIFYxIF0gKSwgbnJvdz0yKQoKY2hpIDwtIGNoaXNxLnRlc3QoS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0cy5tYXRyaXgpCnJldHVybihjaGkpCgp9CgoKCm1hdHJpeC5pbiA8LSAgbWF0cml4KG5yb3c9MiwgYyhLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCmNoaXNxLnRlc3QobWF0cml4LmluKQpgYGAKCgoKYGBge3J9CktDTF9odW1hbi5UT1RBTF9hbmRfTUVfc3RhdHMgPC0gVE9UQUxfTUVfc3RhdHMoS0NMX2h1bWFuKQoKS0NMX0RJVjEwX1RjMS5UT1RBTF9hbmRfTUVfc3RhdHMgPC0gIFRPVEFMX01FX3N0YXRzKEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEpCktDTF9FU0NfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0cyA8LSAgVE9UQUxfTUVfc3RhdHMoS0NMX0VTQ19kZXJpdmVkX25ldXJvbl9DRDEpCktDTF9ESVY0X0NEMS5UT1RBTF9hbmRfTUVfc3RhdHMgPC0gVE9UQUxfTUVfc3RhdHMoS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxKQpLQ0xfRElWMTBfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0cyA8LSBUT1RBTF9NRV9zdGF0cyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxKQoKCk1FX1RPVEFMX2NoaV9zcXVhcmVkKEtDTF9odW1hbi5UT1RBTF9hbmRfTUVfc3RhdHMpCk1FX1RPVEFMX2NoaV9zcXVhcmVkKEtDTF9ESVYxMF9UYzEuVE9UQUxfYW5kX01FX3N0YXRzKQpNRV9UT1RBTF9jaGlfc3F1YXJlZChLQ0xfRVNDX0NEMS5UT1RBTF9hbmRfTUVfc3RhdHMpCk1FX1RPVEFMX2NoaV9zcXVhcmVkKEtDTF9ESVY0X0NEMS5UT1RBTF9hbmRfTUVfc3RhdHMpCk1FX1RPVEFMX2NoaV9zcXVhcmVkKEtDTF9ESVYxMF9DRDEuVE9UQUxfYW5kX01FX3N0YXRzKQoKCmBgYAoKCmBgYHtyfQoKS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJIdW1hbiJdCktDTF9ESVYxMF9UYzEuVE9UQUxfYW5kX01FX3N0YXRzWywgRXhwZXJpbWVudDo9IkRJVjEwX1RjMSJdCktDTF9FU0NfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJFU0NfQ0QxIl0KS0NMX0RJVjRfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJESVY0X0NEMSJdCktDTF9ESVYxMF9DRDEuVE9UQUxfYW5kX01FX3N0YXRzWywgRXhwZXJpbWVudDo9IkRJVjEwX0NEMSJdCgoKS0NMX1RPVEFMLlRPVEFMX2FuZF9NRV9zdGF0cyA8LSByYmluZChLQ0xfaHVtYW4uVE9UQUxfYW5kX01FX3N0YXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtDTF9ESVYxMF9UYzEuVE9UQUxfYW5kX01FX3N0YXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtDTF9FU0NfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLQ0xfRElWNF9DRDEuVE9UQUxfYW5kX01FX3N0YXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtDTF9ESVYxMF9DRDEuVE9UQUxfYW5kX01FX3N0YXRzKQoKCgpLQ0xfVE9UQUwuVE9UQUxfYW5kX01FX3N0YXRzJEV4cGVyaW1lbnQgPC0gZmFjdG9yKEtDTF9UT1RBTC5UT1RBTF9hbmRfTUVfc3RhdHMkRXhwZXJpbWVudCwgbGV2ZWxzPWMoIkh1bWFuIiwgIkVTQ19DRDEiLCAiRElWNF9DRDEiLCAiRElWMTBfQ0QxIiwgIkRJVjEwX1RjMSIpKQoKCgpnZ3Bsb3QoS0NMX1RPVEFMLlRPVEFMX2FuZF9NRV9zdGF0c1tkaWZmIT0iTkEiXSApICsKICBnZW9tX2JhciggYWVzKCBleG9uX3R5cGUsIFBlcmNlbnQsIGZpbGw9ZGlmZiksIHN0YXQ9ImlkZW50aXR5IiAgKSArCiAgZmFjZXRfZ3JpZCggLiB+IEV4cGVyaW1lbnQpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwKSkgKwogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdCbHVlcycpIApgYGAKCgoKCmBgYHtyfQp0YWJsZShLQ0xfaHVtYW4uVE9UQUxfYW5kX01FWyAgZXhvbl90eXBlPT0iRXhvbiIsIGRpZmZdKQpgYGAKCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiZXBpUiIpCmBgYAoKCgoKYGBge3IsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTR9CmxpYnJhcnkoImdncmVwZWwiKQoKdmFsaWRhdGlvbl9leG9ucyA8LWMoImNocjE6MTEwNzM0NTk0LTExMDczNDgzNTorIiwgImNocjE5OjE3NzMxNTAyLTE3NzMxNTMxOi0iLCAiY2hyMTE6MjAwNzI4MzUtMjAwNzI4Nzk6KyIpCgpGaWc1LkEgPC0gZ2dwbG90KGRhdGE9S0NMX2h1bWFuWyBUeXBlPT0iQ0UiLF0pICsKICBnZW9tX3BvaW50KCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9ImdyZXkiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICBnZW9tX3BvaW50KGRhdGE9S0NMX2h1bWFuW1R5cGU9PSJDRSIgJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjksIF0sIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0ic2t5Ymx1ZSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogICBnZW9tX3BvaW50KGRhdGE9S0NMX2h1bWFuW1R5cGU9PSJDRSIgJiBEZWx0YVBzaTwoLTAuMSkgJiBQcm9iYWJpbGl0eT4wLjksIF0sIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0icmVkIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgeGxpbShjKC0wLjgsIDAuOCkpICsKICBmYWNldF9ncmlkKCAuIH4gRzRfYm9sICApICsKICB4bGFiKCJEZWx0YVBTSSAoQ29udHJvbCAtIEtDbCkiKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbl9DRVtDb29yZHMgJWluJSB2YWxpZGF0aW9uX2V4b25zICwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJibHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPTIpICsKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IEtDTF9odW1hbl9DRVtDb29yZHMgJWluJSB2YWxpZGF0aW9uX2V4b25zICwgXSwKICAgICAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIsIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksCiAgICAgICAgICAgICAgICAgIG51ZGdlX3kgICAgICA9IDMsCiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiAgICA9ICJ4IiwKICAgICAgICAgICAgICAgICAgYW5nbGUgICAgICAgID0gOTAsCiAgICAgICAgICAgICAgICAgIHZqdXN0ICAgICAgICA9IDEsCiAgICAgICAgICAgICAgICAgIHNlZ21lbnQuc2l6ZSA9IDAuMiwKICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAuMDUsCiAgICAgICAgICAgICAgICAgIGxhYmVsPUtDTF9odW1hbl9DRVtDb29yZHMgJWluJSB2YWxpZGF0aW9uX2V4b25zICwgaGduY19zeW1ib2xdKSArCiAgeWxpbShjKDAuNSwgMS4xNSkpCgpGaWc1LkEKYGBgCgoKVG8gYW5hbHlzZSBhbGwgdGhlIFdoaXBwZXQgbm9kZSB0eXBlcywgd2UgY2FsY3VsYXRlIHRoZSBvZGQtcmF0aW9zIG9mIGJlaW5nIGRpZmZlcmVudGlhbGx5IGluY2x1ZGVkIGdpdmVuIHRoZSBHNCBwcmVzZW5jZSBvciBhYnNlbmNlIAoKCmBgYHtyfQoKCktDTF9odW1hblsgICwgZGlmZjo9Ik5BIl0KS0NMX2h1bWFuWyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45KSAsIGRpZmY6PSJJbiJdCktDTF9odW1hblsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkpICwgZGlmZjo9IkV4Il0KCktDTF9odW1hbl9zdGF0cyA8LSBtZXJnZShLQ0xfaHVtYW5bICBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCIsICAuKFdPX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLCAKS0NMX2h1bWFuWyAgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCAgLihXX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLApieT1jKCJUeXBlIiwgImRpZmYiKSkKCgoKS0NMX2h1bWFuX3N0YXRzIDwtIG1lcmdlKEtDTF9odW1hbl9zdGF0c1tkaWZmIT0iTkEiXSwgIEtDTF9odW1hbl9zdGF0c1tkaWZmPT0iTkEiICwgLihUeXBlLCAgV09fRzRfTkE9V09fRzQsIFdfRzRfTkE9V19HNCkgXSwgYnk9IlR5cGUiKQoKS0NMX2h1bWFuX3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF9odW1hbl9zdGF0c1sgLCBPUiA6PSBXX0c0X2ZyYXEvV09fRzRfZnJhcV0KCgoKCmdncGxvdChLQ0xfaHVtYW5fc3RhdHMpICsKICAgZ2VvbV90aWxlKCBhZXMoVHlwZSwgZGlmZiwgZmlsbCA9IGxvZzIoT1IpKSkgKwogICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCwgbGltaXRzID0gYygtMS42LCAxLjYpKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgK2xhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKQpgYGAKCgpXZSB1c2UgY2hpLXNxdWFyZWQgdGVzdCB0byBjYWxjdWxhdGUgdGhlIHNpZ25pZmljYW5jZQoKCmBgYHtyfQoKCktDTF9odW1hbl9zdGF0cy5jaGkgPC0gZGF0YS50YWJsZSgpCgpmb3IgKCBpIGluIHVuaXF1ZShLQ0xfaHVtYW5fc3RhdHNbVHlwZSE9IkFMIl0kVHlwZSkpewogIAptYXRyaXguZXggPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNF9OQSwgS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNCwgS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0X05BLCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzQpKQptYXRyaXguZXhfcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmV4KQoKbWF0cml4LmluIDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzQsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNF9OQSwgS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0KSkKbWF0cml4LmluX3JlcyA8LSBjaGlzcS50ZXN0KG1hdHJpeC5pbikKCgoKS0NMX2h1bWFuX3N0YXRzLmNoaSA8LSByYmluZChLQ0xfaHVtYW5fc3RhdHMuY2hpLCBjYmluZChpLCAiRXgiLCBtYXRyaXguZXhfcmVzJHAudmFsdWUpKSAKS0NMX2h1bWFuX3N0YXRzLmNoaSA8LSByYmluZChLQ0xfaHVtYW5fc3RhdHMuY2hpLCBjYmluZChpLCAiSW4iLCBtYXRyaXguaW5fcmVzJHAudmFsdWUpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQoKY29sbmFtZXMoS0NMX2h1bWFuX3N0YXRzLmNoaSkgPC0gYygiVHlwZSIsICJkaWZmIiwgIlBfdmFsdWUiKQoKbnRlc3QgPSBucm93KEtDTF9odW1hbl9zdGF0cy5jaGkpCgpLQ0xfaHVtYW5fc3RhdHMuY2hpWyAsIGA6PWAoUF92YWx1ZS5Cb25mZXJyb25pPWFzLm51bWVyaWMoUF92YWx1ZSkqbnRlc3QpIF0KCktDTF9odW1hbl9zdGF0cyA8LSBtZXJnZShLQ0xfaHVtYW5fc3RhdHMsIEtDTF9odW1hbl9zdGF0cy5jaGksIGJ5PWMoIlR5cGUiLCAiZGlmZiIpKQoKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9Mi4yLCBmaWcud2lkdGg9NX0KCgpsaWJyYXJ5KHBseXIpCgoKZ2dwbG90KEtDTF9odW1hbl9zdGF0cykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgoKCgpgYGAKCgoKYGBge3J9CgpzcGxpY2Vfbm9kZV9kb3RfcGxvdCA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGggKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC1jKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiKSBdLAogICAgICAgICAgICAgICAgICAgIEtDTF94X2Rvd25zdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCgojS0NMX3ggPC0gIEtDTF94W2VuZC1zdGFydD4zMCB8fCBUeXBlIT0iQ0UiLCBdCgpLQ0xfeFsoRzQueD4wIHwgRzQueT4wICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKEc0Lng9PTAgJiBHNC55PT0wICksIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KS0NMX3gkRzRfYm9sIDwtIGZhY3RvcihLQ0xfeCRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfeFsgICwgZGlmZjo9Ik5BIl0KS0NMX3hbIChEZWx0YVBzaTw9LTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJJbiJdCktDTF94WyAoRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+PTAuOTApICwgZGlmZjo9IkV4Il0KCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94WyAgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgLihXT19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwgCktDTF94WyAgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCAgLihXX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLApieT1jKCJUeXBlIiwgImRpZmYiKSkKCgoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHNbZGlmZiE9Ik5BIl0sICBLQ0xfeF9zdGF0c1tkaWZmPT0iTkEiICwgLihUeXBlLCAgV09fRzRfTkE9V09fRzQsIFdfRzRfTkE9V19HNCkgXSwgYnk9IlR5cGUiKQoKS0NMX3hfc3RhdHNbLCBgOj1gKFdPX0c0X2ZyYXE9V09fRzQvV09fRzRfTkEsIFdfRzRfZnJhcT1XX0c0L1dfRzRfTkEpXQoKS0NMX3hfc3RhdHNbICwgT1IgOj0gV19HNF9mcmFxL1dPX0c0X2ZyYXFdCgoKS0NMX3hfc3RhdHMuY2hpIDwtIGRhdGEudGFibGUoKQoKZm9yICggaSBpbiB1bmlxdWUoS0NMX3hfc3RhdHNbVHlwZSE9IkFMIl0kVHlwZSkpewogIAptYXRyaXguZXggPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdPX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNCkpCm1hdHJpeC5leF9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguZXgpCgptYXRyaXguaW4gPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCm1hdHJpeC5pbl9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguaW4pCgoKCktDTF94X3N0YXRzLmNoaSA8LSByYmluZChLQ0xfeF9zdGF0cy5jaGksIGNiaW5kKGksICJFeCIsIG1hdHJpeC5leF9yZXMkcC52YWx1ZSkpIApLQ0xfeF9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX3hfc3RhdHMuY2hpLCBjYmluZChpLCAiSW4iLCBtYXRyaXguaW5fcmVzJHAudmFsdWUpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQoKY29sbmFtZXMoS0NMX3hfc3RhdHMuY2hpKSA8LSBjKCJUeXBlIiwgImRpZmYiLCAiUF92YWx1ZSIpCgpudGVzdCA9IG5yb3coS0NMX3hfc3RhdHMuY2hpKQoKS0NMX3hfc3RhdHMuY2hpWyAsIGA6PWAoUF92YWx1ZS5Cb25mZXJyb25pPWFzLm51bWVyaWMoUF92YWx1ZSkqbnRlc3QpIF0KCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzLCBLQ0xfeF9zdGF0cy5jaGksIGJ5PWMoIlR5cGUiLCAiZGlmZiIpKQoKZ2dwbG90KEtDTF94X3N0YXRzKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2coUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUsIGNvbG91cj1sb2cyKE9SKSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKCnJldHVybihLQ0xfeF9zdGF0cykKCgp9CgpgYGAKCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnVwc3RyZWFtLnBhdGggPSAiLi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIgCmRvd25zdHJlYW0ucGF0aCA9ICIuLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiIAoKc3BsaWNlX25vZGVfZG90X3Bsb3QyIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCApIHsKCktDTF94X3Vwc3RyZWFtIDwtIGZyZWFkKHVwc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfdXBzdHJlYW0pIDwtIGMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiICApCgoKS0NMX3hfZG93bnN0cmVhbTwtIGZyZWFkKGRvd25zdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF9kb3duc3RyZWFtKSA8LWMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiICApCgoKS0NMX3ggPC0gIG1lcmdlKEtDTF94X3Vwc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiKSBdLCAKICAgICAgICAgICAgICAgICAgICBieT1jKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IikgKQoKCiNLQ0xfeCA8LSAgS0NMX3hbZW5kLXN0YXJ0PjMwIHx8IFR5cGUhPSJDRSIsIF0KCktDTF94WyhHNC54PjAgfCBHNC55PjAgKSwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQpLQ0xfeFsoRzQueD09MCAmIEc0Lnk9PTAgKSwgRzRfYm9sOj0iV2l0aG91dCBHLXF1YWRydXBsZXgiXQpLQ0xfeCRHNF9ib2wgPC0gZmFjdG9yKEtDTF94JEc0X2JvbCwgbGV2ZWxzPWMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikgKQoKCktDTF94WyAgLCBkaWZmOj0iTkEiXQpLQ0xfeFsgKERlbHRhUHNpPD0tMC4xICYgUHJvYmFiaWxpdHk+PTAuOTApICwgZGlmZjo9IkluIl0KS0NMX3hbIChEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iRXgiXQoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hbICBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCIsICAuKFdPX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLCAKS0NMX3hbICBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsICAuKFdfRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sCmJ5PWMoIlR5cGUiLCAiZGlmZiIpKQoKCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeF9zdGF0c1tkaWZmIT0iTkEiXSwgIEtDTF94X3N0YXRzW2RpZmY9PSJOQSIgLCAuKFR5cGUsICBXT19HNF9OQT1XT19HNCwgV19HNF9OQT1XX0c0KSBdLCBieT0iVHlwZSIpCgpLQ0xfeF9zdGF0c1ssIGA6PWAoV09fRzRfZnJhcT1XT19HNC9XT19HNF9OQSwgV19HNF9mcmFxPVdfRzQvV19HNF9OQSldCgpLQ0xfeF9zdGF0c1sgLCBPUiA6PSBXX0c0X2ZyYXEvV09fRzRfZnJhcV0KCgpLQ0xfeF9zdGF0cy5jaGkgPC0gZGF0YS50YWJsZSgpCgpmb3IgKCBpIGluIHVuaXF1ZShLQ0xfeF9zdGF0c1tUeXBlIT0iQUwiXSRUeXBlKSl7CiAgCm1hdHJpeCA8LSAgbWF0cml4KG5yb3c9MiwgYyhLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNCwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0KSkKbWF0cml4LnJlcyA8LSBjaGlzcS50ZXN0KG1hdHJpeCkKCgoKCgpLQ0xfeF9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX3hfc3RhdHMuY2hpLCBjYmluZChpLCAgbWF0cml4LnJlcyRwLnZhbHVlKSkgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp9Cgpjb2xuYW1lcyhLQ0xfeF9zdGF0cy5jaGkpIDwtIGMoIlR5cGUiLCAiUF92YWx1ZSIpCgpudGVzdCA9IG5yb3coS0NMX3hfc3RhdHMuY2hpKQoKS0NMX3hfc3RhdHMuY2hpWyAsIGA6PWAoUF92YWx1ZS5Cb25mZXJyb25pPWFzLm51bWVyaWMoUF92YWx1ZSkqbnRlc3QpIF0KCiNLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeF9zdGF0cywgS0NMX3hfc3RhdHMuY2hpLCBieT1jKCJUeXBlIiwgImRpZmYiKSkKCiNnZ3Bsb3QoS0NMX3hfc3RhdHMuY2hpKSArCiMgIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKIyAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwojICB0aGVtZV9idygpICsKIyAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgpyZXR1cm4oS0NMX3hfc3RhdHMuY2hpKQoKCn0KCmBgYAoKCgoKYGBge3J9CgpkaWZmX0c0X01FX3RhYmxlIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCwgZGlzdF9saW0gKSB7CgoKS0NMX3hfdXBzdHJlYW0gPC0gZnJlYWQodXBzdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCktDTF94X3Vwc3RyZWFtWyAsZGlzdDo9KChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSAtdy5zdGFydCAgKSBdCiNLQ0xfeFsoZGlzdC54PD1kaXN0X2xpbSB8IGRpc3QueTw9ZGlzdF9saW0gKSwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtWyAsZGlzdDo9KChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgLSB3LnN0YXJ0ICAgXQoKS0NMX3ggPC0gIG1lcmdlKEtDTF94X3Vwc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJkaXN0IikgXSwKICAgICAgICAgICAgICAgICAgICBLQ0xfeF9kb3duc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJkaXN0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCgojS0NMX3ggPC0gIEtDTF94W2VuZC1zdGFydD4zMCB8fCBUeXBlIT0iQ0UiLCBdCgpLQ0xfeFsgLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCgpLQ0xfeFtzdHJhbmQ9PSIrIiAmICgoZGlzdC54ID49IC1kaXN0X2xpbSAmICBkaXN0LnggIDw9IDApIHwgKCBkaXN0LnkgPj0wICYgZGlzdC55PD1kaXN0X2xpbSkpICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQpLQ0xfeFtzdHJhbmQ9PSItIiAmICgoZGlzdC55ID49IC1kaXN0X2xpbSAmICBkaXN0LnkgIDw9IDApIHwgKCBkaXN0LnggPj0wICYgZGlzdC54PD1kaXN0X2xpbSkpICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKS0NMX3gkRzRfYm9sIDwtIGZhY3RvcihLQ0xfeCRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfeFsgICwgZGlmZjo9Ik5BIl0KS0NMX3hbIChEZWx0YVBzaTw9LTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJJbiJdCktDTF94WyAoRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+PTAuOTApICwgZGlmZjo9IkV4Il0KCgpLQ0xfeCA8LSBLQ0xfeFtUeXBlPT0iQ0UiXQoKS0NMX3hbICwgIGV4b25fY2xhc3M6PSJleG9uIl0KS0NMX3hbZW5kLXN0YXJ0PD0zMCwgIGV4b25fY2xhc3M6PSJtaWNyb2V4b24iIF0KCnJldHVybihLQ0xfeCkKCn0KYGBgCgoKYGBge3J9CgpgYGAKCgoKYGBge3J9CnVwc3RyZWFtLnBhdGggPSAiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHNlcV9LIgpkb3duc3RyZWFtLnBhdGggPSAiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0c2VxX0siCgpHNF9NRV90YWJsZSA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGgsIGRpc3RfbGltICkgewoKCktDTF94X3Vwc3RyZWFtIDwtIGZyZWFkKHVwc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfdXBzdHJlYW0pIDwtIGMoICJjaHJvbSIsICJzc3RhcnQiLCAic2VuZCIsICJzc3RyYW5kIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKS0NMX3hfdXBzdHJlYW1bICxkaXN0Oj0oc3N0YXJ0IC0gKGdzdGFydCArIChnZW5kLSBnc3RhcnQpLzIpKSBdCiNLQ0xfeFsoZGlzdC54PD1kaXN0X2xpbSB8IGRpc3QueTw9ZGlzdF9saW0gKSwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC0gYyggImNocm9tIiwgInNzdGFydCIsICJzZW5kIiwgInN0cmFuZCIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKCktDTF94X2Rvd25zdHJlYW1bICxkaXN0Oj0oc3N0YXJ0IC0gKGdzdGFydCArIChnZW5kLSBnc3RhcnQpLzIpKSBdCgpLQ0xfeCA8LSAgbWVyZ2UoS0NMX3hfdXBzdHJlYW1bLCBjKCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJkaXN0IikgXSwKICAgICAgICAgICAgICAgICAgICBLQ0xfeF9kb3duc3RyZWFtWywgYyggImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIikgKQoKCiNLQ0xfeCA8LSAgS0NMX3hbZW5kLXN0YXJ0PjMwIHx8IFR5cGUhPSJDRSIsIF0KCktDTF94WyAsIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KCktDTF94WyBzdHJhbmQ9PSIrIiAmICgoZGlzdC54ID49IC1kaXN0X2xpbSAmICBkaXN0LnggIDw9IDApIHwgKCBkaXN0LnkgPj0wICYgZGlzdC55PD1kaXN0X2xpbSkpICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQpLQ0xfeFsgc3RyYW5kPT0iLSIgJiAoKGRpc3QueSA+PSAtZGlzdF9saW0gJiAgZGlzdC55ICA8PSAwKSB8ICggZGlzdC54ID49MCAmIGRpc3QueDw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCgpLQ0xfeCRHNF9ib2wgPC0gZmFjdG9yKEtDTF94JEc0X2JvbCwgbGV2ZWxzPWMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikgKQoKCktDTF94WyAsICBleG9uX2NsYXNzOj0iZXhvbiJdCktDTF94W2VuZC1zdGFydDw9MzAsICBleG9uX2NsYXNzOj0ibWljcm9leG9uIiBdCgpyZXR1cm4oS0NMX3gpCgp9CgpgYGAKCgoKYGBge3J9CgpLQ0xfaHVtYW5fQ0UgPC0gS0NMX2h1bWFuWyAsIHBhc3RlKGNocm9tLCAgIHN0YXJ0LCAgICAgZW5kLCBzZXA9Il8iICkgXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzIDwtIGZyZWFkKCIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLnVwc3RyZWFtLkc0cyIpCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzIDwtIGZyZWFkKCIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLmRvd25zdHJlYW0uRzRzIikKCgoKY29sbmFtZXMoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzKSA8LSBjKCAiY2hyb20iLCAic3N0YXJ0IiwgInNlbmQiLCAic3N0cmFuZCIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbICxkaXN0Oj0oIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSAtIHNzdGFydCAgICkgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyAsIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBkaXN0Pj0tMTAwICAmIGRpc3Q8PTAgLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCgoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyAsIElEOj1wYXN0ZShjaHJvbSwgICBzdGFydCwgICAgIGVuZCwgc2VwPSJfIiApXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWywgZmlsdGVyOj0iT3V0Il0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBJRCAlaW4lICBLQ0xfaHVtYW5fQ0UsIF0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cyA8LSBodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbIElEICVpbiUgIEtDTF9odW1hbl9DRSwgXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLnN0YXRzIDwtaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBleG9uX2xlbjw9MzAwLCAuTiAgLCBieT0gYygiZXhvbl9sZW4iLCAiRzRfYm9sIikgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuc3RhdHNbLCBUb3RhbDo9c3VtKE4pLCBieT1leG9uX2xlbl0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLnN0YXRzWywgUGVyY2VudGFnZTo9TioxMDAvVG90YWxdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMkRzRfYm9sIDwtIGZhY3RvcihodW1hbi5leG9ucy51cHN0cmVhbS5HNHMkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSkKCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy4zMDAgPC0gaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2V4b25fbGVuPD0zMDBdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwJGJpbiA8LSBjdXQoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2V4b25fbGVuPD0xNTBdJGV4b25fbGVuLCBicmVha3M9NjAsIGxhYmVscz0gc2VxKDUsIDMwMCwgNSksIGluY2x1ZGUubG93ZXN0PVRSVUUgKQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMC5zdGF0cyA8LWh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy4zMDBbIGV4b25fbGVuPD0xNTAsIC5OICAsIGJ5PSBjKCJiaW4iLCAiRzRfYm9sIikgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzWywgVG90YWw6PXN1bShOKSwgYnk9YmluXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzWywgUGVyY2VudGFnZTo9TioxMDAvVG90YWxdCgpsYWJlbHM9IHNlcSgtOTk1LCAxMDAwLCA1KSwgaW5jbHVkZS5sb3dlc3Q9VFJVRSApCgpnZ3Bsb3QoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2ZpbHRlcj09IkluIl0pICsKICBnZW9tX2JhcihhZXMoeD1leG9uX2xlbiwgZmlsbD1HNF9ib2wpLCBwb3NpdGlvbiA9ICJmaWxsIiApICsKICB4bGltKGMoMSwgMTUwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJyZWQiKSArCiAgeWxpbShjKDAsIDAuMSkpCgoKCmdncGxvdChodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICsKICBnZW9tX2JhcihhZXMoeD1iaW4sIHk9UGVyY2VudGFnZSksIHN0YXQgPSAiaWRlbnRpdHkiICkgCgoKYGBgCgoKCmBgYHtyfQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyA8LSBmcmVhZCgiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0c2VxX1BEUyIpCgpjb2xuYW1lcyhodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cykgPC0gYyggImNocm9tIiwgInNzdGFydCIsICJzZW5kIiwgInNzdHJhbmQiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbICxkaXN0Oj0oIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSAtIHNzdGFydCkgXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgc3N0cmFuZD09Ii0iLCBkaXN0Oj0oICAgc3N0YXJ0IC0gKGdzdGFydCArIChnZW5kLSBnc3RhcnQpLzIpKSBdCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1ssIGV4b25fbGVuOj1lbmQtc3RhcnRdCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBkaXN0PD0xMDAgICYgZGlzdD49MCAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1ssIGV4b25fY2xhc3M6PSJleG9uIl0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fbGVuPD0zMCwgZXhvbl9jbGFzczo9Im1pY3JvZXhvbiJdCgoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3coaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCgpjaGlzcS50ZXN0KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLjJ4MikKCgoKCgoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbICwgSUQ6PXBhc3RlKGNocm9tLCAgIHN0YXJ0LCAgICAgZW5kLCBzZXA9Il8iICldCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1ssIGZpbHRlcjo9Ik91dCJdCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBJRCAlaW4lICBLQ0xfaHVtYW5fQ0UsICBmaWx0ZXI6PSJJbiJdCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyA8LSBodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgSUQgJWluJSAgS0NMX2h1bWFuX0NFLCBdCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy5zdGF0cyA8LWh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2xlbjw9MzAwLCAuTiAgLCBieT0gYygiZXhvbl9sZW4iLCAiRzRfYm9sIikgXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy5zdGF0c1ssIFRvdGFsOj1zdW0oTiksIGJ5PWV4b25fbGVuXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy5zdGF0c1ssIFBlcmNlbnRhZ2U6PU4qMTAwL1RvdGFsXQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMkRzRfYm9sIDwtIGZhY3RvcihodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpKQoKCgpnZ3Bsb3QoaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMpICsKICBnZW9tX2JhcihhZXMoeD1leG9uX2xlbiwgZmlsbD1HNF9ib2wpLCBwb3NpdGlvbiA9ICJmaWxsIiApICsKICB4bGltKGMoMSwgMzAwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJyZWQiKSArCiAgeWxpbShjKDAsIDAuMSkpCgoKCmdncGxvdChodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy5zdGF0c1tHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSArCiAgZ2VvbV9iYXIoYWVzKHg9ZXhvbl9sZW4sIHk9UGVyY2VudGFnZSksIHN0YXQgPSAiaWRlbnRpdHkiICkgKwogIHhsaW0oYygxLCAzMDApKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvdXI9InJlZCIpIAoKYGBgCgoKCmBgYHtyfQpnZ3Bsb3QoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzKSArCiAgZ2VvbV9iYXIoYWVzKHg9ZXhvbl9sZW4sIGZpbGw9RzRfYm9sKSwgcG9zaXRpb24gPSAiZmlsbCIgKSArCiAgeGxpbShjKDEsIDE1MCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzMCkgKwogIHlsaW0oYygwLjgsIDEpKQpgYGAKCmBgYHtyfQoKZ2dwbG90KGhnMTlfTUVfdGFibGVfRzRzKSArIAogIGdlb21fYm94cGxvdChhZXMoRzRfYm9sLCBleG9uX2xlbikpICsKICB5bGltKGMoMCwgMzAwKSkKCgpoZzE5X01FX3RhYmxlX0tbLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKZ2dwbG90KGhnMTlfTUVfdGFibGVfSykgKyAKICBnZW9tX2JveHBsb3QoYWVzKEc0X2JvbCwgZXhvbl9sZW4pKSArCiAgeWxpbShjKDAsIDMwMCkpCgpoZzE5X01FX3RhYmxlX0c0c1ssIG1lZGlhbihleG9uX2xlbiksIGJ5PUc0X2JvbF0KaGcxOV9NRV90YWJsZV9LWywgbWVkaWFuKGV4b25fbGVuKSwgYnk9RzRfYm9sXQoKZ2dwbG90KGhnMTlfTUVfdGFibGVfUERTKSArIAogIGdlb21fYm94cGxvdChhZXMoRzRfYm9sLCBleG9uX2xlbikpICsKICB5bGltKGMoMCwgMzAwKSkKCmBgYAoKCgoKYGBge3J9CgpodW1hbi5NRV9nNC5zdGF0cyA8LSBkYXRhLnRhYmxlKCkKCmhnMTlfTUVfdGFibGVfRzRzIDwtIEc0X01FX3RhYmxlKCIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLnVwc3RyZWFtLkc0cyIgLCAiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0cyIsIDEwMCApCgoKCmhnMTlfTUVfdGFibGVfRzRzLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhoZzE5X01FX3RhYmxlX0c0c1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9HNHNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpoZzE5X01FX3RhYmxlX0c0c1sgLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKCmNvbG5hbWVzKGhnMTlfTUVfdGFibGVfRzRzLjJ4MikgPC0gYygiZXhvbiIsICJtaWNyb2V4b24iKQpyb3duYW1lcyhoZzE5X01FX3RhYmxlX0c0cy4yeDIpIDwtIGMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikKCgpodW1hbi5NRV9nNC5zdGF0cyA8LSByYmluZChodW1hbi5NRV9nNC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdGlmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX0c0cy4yeDIpJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhnMTlfTUVfdGFibGVfRzRzLjJ4MlsgMiAsIDIgXS9oZzE5X01FX3RhYmxlX0c0cy4yeDJbIDEgLCAyIF0pIC8gKGhnMTlfTUVfdGFibGVfRzRzLjJ4MlsgMiAsIDEgXS9oZzE5X01FX3RhYmxlX0c0cy4yeDJbIDEgLCAxIF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKCgpoZzE5X01FX3RhYmxlX0sgPC0gRzRfTUVfdGFibGUoIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKCgpoZzE5X01FX3RhYmxlX0suMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KGhnMTlfTUVfdGFibGVfS1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9LWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX0tbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9LWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX0suMngyKQoKCmh1bWFuLk1FX2c0LnN0YXRzIDwtIHJiaW5kKGh1bWFuLk1FX2c0LnN0YXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSysiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaXNxLnRlc3QoIGhnMTlfTUVfdGFibGVfSy4yeDIpJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhnMTlfTUVfdGFibGVfSy4yeDJbIDIgLCAyIF0vaGcxOV9NRV90YWJsZV9LLjJ4MlsgMSAsIDIgXSkgLyAoaGcxOV9NRV90YWJsZV9LLjJ4MlsgMiAsIDEgXS9oZzE5X01FX3RhYmxlX0suMngyWyAxICwgMSBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCgoKaGcxOV9NRV90YWJsZV9QRFMgPC0gRzRfTUVfdGFibGUoIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCgpoZzE5X01FX3RhYmxlX1BEUy4yeDIgPC0gbWF0cml4KG5jb2wgPSAyLApjKG5yb3coaGcxOV9NRV90YWJsZV9QRFNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfUERTWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX1BEU1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX1BEU1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggaGcxOV9NRV90YWJsZV9QRFMuMngyKQoKaHVtYW4uTUVfZzQuc3RhdHMgPC0gcmJpbmQoaHVtYW4uTUVfZzQuc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaXNxLnRlc3QoIGhnMTlfTUVfdGFibGVfUERTLjJ4MikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGcxOV9NRV90YWJsZV9QRFMuMngyWyAyICwgMiBdL2hnMTlfTUVfdGFibGVfUERTLjJ4MlsgMSAsIDIgXSkgLyAoaGcxOV9NRV90YWJsZV9QRFMuMngyWyAyICwgMSBdL2hnMTlfTUVfdGFibGVfUERTLjJ4MlsgMSAsIDEgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQoKYGBgCgoKYGBge3J9CmNvbG5hbWVzKGh1bWFuLk1FX2c0LnN0YXRzKSA8LSBjKCJHNF9zaWduYWwiLCAicC52YWx1ZSIsICJPUiIpIAoKaHVtYW4uTUVfZzQuc3RhdHNbLCBQX3ZhbHVlLkJvbmZlcnJvbmk6PWFzLm51bWVyaWMocC52YWx1ZSkqM10KCgpnZ3Bsb3QoaHVtYW4uTUVfZzQuc3RhdHMpICsKICBnZW9tX3BvaW50KGFlcyhHNF9zaWduYWwsIGxvZzIoYXMubnVtZXJpYyhPUikpLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1ICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCmBgYAoKCgoKYGBge3J9CnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwgMTAwICkKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCgoKCgogZ2dwbG90KGRhdGE9cHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfTUVfdGFibGVbIFR5cGU9PSJDRSIsXSkgKwogIGdlb21fcG9pbnQoIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iZ3JleSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJza3libHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPCgtMC4xKSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJyZWQiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICB4bGltKGMoLTAuOCwgMC44KSkgKwogIHhsYWIoIkRlbHRhUFNJIChDb250cm9sIC0gS0NsKSIpICsKICB0aGVtZV9idygpCgpgYGAKCgoKYGBge3J9CgoKIGdncGxvdChkYXRhPUtDTF9odW1hblsgVHlwZT09IkNFIixdKSArCiAgZ2VvbV9wb2ludCggYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJncmV5IiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InNreWJsdWUiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k8KC0wLjEpICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InJlZCIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIHhsaW0oYygtMC44LCAwLjgpKSArCiAgeGxhYigiRGVsdGFQU0kgKENvbnRyb2wgLSBLQ2wpIikgKwogIHRoZW1lX2J3KCkKCgoKIGdncGxvdChkYXRhPXByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbIFR5cGU9PSJDRSIsXSkgKwogIGdlb21fcG9pbnQoIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iZ3JleSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJza3libHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPCgtMC4xKSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJyZWQiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICB4bGltKGMoLTAuOCwgMC44KSkgKwogIHhsYWIoIkRlbHRhUFNJIChDb250cm9sIC0gS0NsKSIpICsKICB0aGVtZV9idygpCgogCiAKIAogCktDTF9odW1hblssIEV4cGVyaW1lbnQ6PSJIdW1hbiJdIApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9NRV90YWJsZVssIEV4cGVyaW1lbnQ6PSJESVY0X0NEMSJdCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfTUVfdGFibGVbLCBFeHBlcmltZW50Oj0iRVNDX0NEMSJdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9NRV90YWJsZVssIEV4cGVyaW1lbnQ6PSJESVYxMF9DRDEiXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfTUVfdGFibGVbLCBFeHBlcmltZW50Oj0iRElWMTBfVGMxIl0KCgoKVE9UQUwuS0NMX2RpZmYgPC0gcmJpbmQoS0NMX2h1bWFuWywgYygiVHlwZSIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJFeHBlcmltZW50IildLAogICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9NRV90YWJsZVssIGMoIlR5cGUiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRXhwZXJpbWVudCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9NRV90YWJsZVssIGMoIlR5cGUiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRXhwZXJpbWVudCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX01FX3RhYmxlWywgYygiVHlwZSIgLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRXhwZXJpbWVudCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX01FX3RhYmxlWywgYygiVHlwZSIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJFeHBlcmltZW50IildICkKCgoKClRPVEFMLktDTF9kaWZmJEV4cGVyaW1lbnQgPC0gZmFjdG9yKFRPVEFMLktDTF9kaWZmJEV4cGVyaW1lbnQsIGxldmVscz1jKCJIdW1hbiIsICJFU0NfQ0QxIiwgIkRJVjRfQ0QxIiwgIkRJVjEwX0NEMSIsICJESVYxMF9UYzEiKSkKCgoKIGdncGxvdChkYXRhPVRPVEFMLktDTF9kaWZmWyBUeXBlPT0iQ0UiLF0pICsKICBnZW9tX3BvaW50KCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9ImdyZXkiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICBnZW9tX3BvaW50KGRhdGE9VE9UQUwuS0NMX2RpZmZbVHlwZT09IkNFIiAmIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJza3libHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgIGdlb21fcG9pbnQoZGF0YT1UT1RBTC5LQ0xfZGlmZltUeXBlPT0iQ0UiICYgRGVsdGFQc2k8KC0wLjEpICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InJlZCIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKyAKICAgZmFjZXRfZ3JpZCguIH4gRXhwZXJpbWVudCApICsKICB4bGltKGMoLTAuOCwgMC44KSkgKwogIHhsYWIoIkRlbHRhUFNJIChDb250cm9sIC0gS0NsKSIpICsKICB0aGVtZV9idygpCgoKS0NMX2h1bWFuLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJIdW1hbiJdCktDTF9ESVYxMF9UYzEuVE9UQUxfYW5kX01FX3N0YXRzWywgRXhwZXJpbWVudDo9IkRJVjEwX1RjMSJdCktDTF9FU0NfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJFU0NfQ0QxIl0KS0NMX0RJVjRfQ0QxLlRPVEFMX2FuZF9NRV9zdGF0c1ssIEV4cGVyaW1lbnQ6PSJESVY0X0NEMSJdCktDTF9ESVYxMF9DRDEuVE9UQUxfYW5kX01FX3N0YXRzWywgRXhwZXJpbWVudDo9IkRJVjEwX0NEMSJdCgpgYGAKCgoKCgpgYGB7cn0KCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKCgp0b3RhbF9tb3VzZV9LX01FX3RhYmxlIDwtIHVuaXF1ZShyYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0pKQoKCnRvdGFsX21vdXNlX0tfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggdG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpCgoKY29sbmFtZXModG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpIDwtIGMoImV4b24iLCAibWljcm9leG9uIikKcm93bmFtZXModG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpIDwtIGMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLCAxMDAgKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlIDwtIHVuaXF1ZShyYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSkpCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyh0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MikKYGBgCgoKYGBge3J9CgpLQ0xfaHVtYW5bLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX21vdGlmX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwgMTAwICkKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLCAxMDAgKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfbW90aWZfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwgMTAwICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9tb3RpZl9NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfbW90aWZfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQoKCkFsbF9tb3VzZSA8LSBkYXRhLnRhYmxlKHVuaXF1ZShjKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfS19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9LX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfbW90aWZfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0pKSkKCgpjb2xuYW1lcyhBbGxfbW91c2UpIDwtICJJRCIKCgoKCgpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWZfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWY6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfbW90aWY6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfbW90aWZfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZjo9VFJVRSAgIF0KCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0s6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0s6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfSzo9VFJVRSAgIF0KCgpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEUzo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTOj1UUlVFICAgXQoKCkFsbF9tb3VzZSA8LSBjYmluZChBbGxfbW91c2UsIHJvd1N1bXMoaXMubmEoQWxsX21vdXNlKSkpCgoKZndyaXRlKEFsbF9tb3VzZVtvcmRlcihWMildLCAiLi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL1RvdGFsX21vdXNlLnR4dCIsIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgogICAgICAgCgogICAgICAgCgpodW1hbl9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHMiLCAxMDAgKSAgIApodW1hbl9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKaHVtYW5fUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApICAgCiAgICAgCmh1bWFuX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9QRFNfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgpBbGxfaHVtYW48LSBkYXRhLnRhYmxlKHVuaXF1ZShjKCAgICAgICAgIApodW1hbl9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwgICAgICAgCmh1bWFuX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCmh1bWFuX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSkpKQoKY29sbmFtZXMoQWxsX2h1bWFuKSA8LSAiSUQiCgoKCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9tb3RpZl9NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX21vdGlmOj1UUlVFICAgXQpBbGxfaHVtYW5bIElEICVpbiUgaHVtYW5fS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX0s6PVRSVUUgICBdCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9QRFNfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgZGlmZl86PVRSVUUgICBdCgoKCkFsbF9odW1hbiA8LSBjYmluZChBbGxfaHVtYW4sIHJvd1N1bXMoaXMubmEoQWxsX2h1bWFuKSkpCgoKZndyaXRlKEFsbF9odW1hbltvcmRlcihWMildLCAiLi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL1RvdGFsX2h1bWFuLnR4dCIsICBuYT0iRkFMU0UiLCBzZXAgPSAiXHQiLCBxdW90ZT1GKQoKCgoKCmBgYAoKCiMjIE5vdCB3b3JraW5nCgpgYGB7cn0KaHVtYW5fbW91c2UgPC0gZnJlYWQoIi4uL3BvdGFzc2l1bV9leHBlcmltZW50cy9odW1hbl9tb3VzZS4wLjIuZXhvbnMiKQoKY29sbmFtZXMoaHVtYW5fbW91c2UpIDwtIGMoImhJRCIsICJtSUQiLCAic2NvcmVfaW5kZXgiKQoKCkFsbF9odW1hbi5tb3VzZSA8LSBtZXJnZShBbGxfaHVtYW4sIGh1bWFuX21vdXNlLCBieS54PSJJRCIsIGJ5Lnk9ImhJRCIpCgoKQWxsX2h1bWFuLm1vdXNlIDwtIG1lcmdlKEFsbF9odW1hbi5tb3VzZSwgQWxsX21vdXNlLCBieS54ID0gIm1JRCIsIGJ5Lnk9IklEIikKCgoKCgpBbGxfaHVtYW4ubW91c2UuZGlmZiA8LSAgQWxsX2h1bWFuLm1vdXNlW1YyLnk8MTIgJiBWMi54PDMgXQoKCkFsbF9odW1hbi5tb3VzZS5kaWZmCgoKCgoKS0NMX2h1bWFuX0NFWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQoKCkFsbF9odW1hbi5tb3VzZS5kaWZmLmdlbmUgPC0gbWVyZ2UoQWxsX2h1bWFuLm1vdXNlLmRpZmYsIEtDTF9odW1hbl9DRSwgYnk9IklEIikKCgpWaWV3KEFsbF9odW1hbi5tb3VzZS5kaWZmLmdlbmVbb3JkZXIoVjIueSwgVjIueCAgKV1bLCBjKCJJRCIsICJtSUQiLCAiVjIueCIsICJWMi55IiwgIndpa2lnZW5lX2Rlc2NyaXB0aW9uIiwgImhnbmNfc3ltYm9sIildICkKCgpjYXQoQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZVssIGhnbmNfc3ltYm9sXSwgc2VwPSJcbiIpCgpmd3JpdGUoQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZVtvcmRlcihWMi55LCBWMi54ICApXVssIGMoIklEIiwgIlYyLngiLCAiVjIueSIsICJ3aWtpZ2VuZV9kZXNjcmlwdGlvbiIsICJoZ25jX3N5bWJvbCIpXSwgIi4uL3BvdGFzc2l1bV9leHBlcmltZW50cy9odW1hbi5tb3VzZS5kaWZmLkc0LmdlbmUudHh0IiwgIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgpgYGAKCgoKYGBge3J9CktDTF9odW1hbltJRD0iIl0KYGBgCgoKCmBgYHtyfQoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgbWVhbihleG9uX2xlbikgXQp0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgbWVhbihleG9uX2xlbikgXQoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlWywgZXhvbl9sZW46PWVuZC1zdGFydF0KCndpbGNveC50ZXN0KCAgZXhvbl9sZW4gfiBHNF9ib2wsIGRhdGE9dG90YWxfbW91c2VfUERTX01FX3RhYmxlICkKCgoKYGBgCgoKCmBgYHtyfQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUuMngyKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLCAxMDAgKQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3cocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3cocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUuMngyKQoKCgpDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGUuMngyKQoKCkNvbnRyb2xfdnNfS0NMX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KENvbnRyb2xfdnNfS0NMX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyKQpgYGAKCgpgYGB7cn0Kc3BsaWNlX25vZGVfZG90X3Bsb3QzIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCwgZGlzdF9saW0gKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKS0NMX3hfdXBzdHJlYW1bICxkaXN0Oj1hYnMody5zdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtWyAsZGlzdDo9YWJzKHcuc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKGRpc3QueD5kaXN0X2xpbSAmIGRpc3QueT5kaXN0X2xpbSApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeFsgIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIC4oV09fRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sIApLQ0xfeFsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzW2RpZmYhPSJOQSJdLCAgS0NMX3hfc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF94X3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF94X3N0YXRzWyAsIE9SIDo9IFdfRzRfZnJhcS9XT19HNF9mcmFxXQoKCktDTF94X3N0YXRzLmNoaSA8LSBkYXRhLnRhYmxlKCkKCmZvciAoIGkgaW4gdW5pcXVlKEtDTF94X3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzQpKQptYXRyaXguZXhfcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmV4LCBjb3JyZWN0PVRSVUUpCgptYXRyaXguaW4gPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCm1hdHJpeC5pbl9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguaW4sIGNvcnJlY3Q9VFJVRSkKCgoKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIkV4IiwgbWF0cml4LmV4X3JlcyRwLnZhbHVlKSkgCktDTF94X3N0YXRzLmNoaSA8LSByYmluZChLQ0xfeF9zdGF0cy5jaGksIGNiaW5kKGksICJJbiIsIG1hdHJpeC5pbl9yZXMkcC52YWx1ZSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp9Cgpjb2xuYW1lcyhLQ0xfeF9zdGF0cy5jaGkpIDwtIGMoIlR5cGUiLCAiZGlmZiIsICJQX3ZhbHVlIikKCm50ZXN0ID0gbnJvdyhLQ0xfeF9zdGF0cy5jaGkpCgpLQ0xfeF9zdGF0cy5jaGlbICwgYDo9YChQX3ZhbHVlLkJvbmZlcnJvbmk9YXMubnVtZXJpYyhQX3ZhbHVlKSpudGVzdCkgXQoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHMsIEtDTF94X3N0YXRzLmNoaSwgYnk9YygiVHlwZSIsICJkaWZmIikpCgpnZ3Bsb3QoS0NMX3hfc3RhdHMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKcmV0dXJuKEtDTF94X3N0YXRzKQoKCn0KYGBgCgoKCgoKCgoKYGBge3IsICBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0KCmh1bWFuLmRvdHBsb3QgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QyKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9Db250cm9sX3ZzX0tDTC5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIsICAiLi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgoKaHVtYW4ubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCgoKaHVtYW4uSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCmh1bWFuLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKaHVtYW4ubW90aWZbICwgRzRfc2lnbmFsOj0iTW90aWYiICBdCmh1bWFuLktbICwgRzRfc2lnbmFsOj0iSysiICBdCmh1bWFuLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpodW1hbi5tb3RpZl9LX1BEUyA8LSByYmluZChodW1hbi5tb3RpZiwgaHVtYW4uSywgaHVtYW4uUERTKQoKaHVtYW4ubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihodW1hbi5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCkZpZzUuQTEgPC0gZ2dwbG90KGh1bWFuLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpGaWc1LkExCmBgYAoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKc3VwcC5kb3RwbG90LkEgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QyKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiwgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCgoKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLktbICwgRzRfc2lnbmFsOj0iSysiICBdCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuUERTWyAsIEc0X3NpZ25hbDo9IlBEUyIgIF0KCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWZfS19QRFMgPC0gcmJpbmQoRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5tb3RpZiwgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5LLCBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLlBEUykKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCwgbGV2ZWxzID0gYygiTW90aWYiLCAiSysiLCAiUERTIikgKQoKZ2dwbG90KEVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWZfS19QRFMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgZmFjZXRfZ3JpZChHNF9zaWduYWwgfiAuKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpgYGAKCgoKCmBgYHtyLCAgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CgpzdXBwLmRvdHBsb3QuQyA8LSAgc3BsaWNlX25vZGVfZG90X3Bsb3QyKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW0uRzRzLmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZlsgLCBHNF9zaWduYWw6PSJNb3RpZiIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLktbICwgRzRfc2lnbmFsOj0iSysiICBdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5QRFNbICwgRzRfc2lnbmFsOj0iUERTIiAgXQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmX0tfUERTIDwtIHJiaW5kKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZiwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkssIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5QRFMpCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWZfS19QRFMkRzRfc2lnbmFsLCBsZXZlbHMgPSBjKCJNb3RpZiIsICJLKyIsICJQRFMiKSApCgpnZ3Bsb3QocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKCmBgYAoKCgoKYGBge3IsICBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0KCnN1cHAuZG90cGxvdC5EIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiwgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuS1sgLCBHNF9zaWduYWw6PSJLKyIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMgPC0gcmJpbmQocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuSywgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLlBEUykKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwgPC0gZmFjdG9yKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgZmFjZXRfZ3JpZChHNF9zaWduYWwgfiAuKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpgYGAKCgoKCgoKYGBge3IsICBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0KCnN1cHAuZG90cGxvdC5CIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWZbICwgRzRfc2lnbmFsOj0iTW90aWYiICBdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLktbICwgRzRfc2lnbmFsOj0iSysiICBdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZl9LX1BEUyA8LSByYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZiwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuSywgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuUERTKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZl9LX1BEUykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nMTAoUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUsIGNvbG91cj1sb2cyKE9SKSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICBmYWNldF9ncmlkKEc0X3NpZ25hbCB+IC4pICsKICB5bGFiKCIiKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCmBgYAoKCgpgYGB7cn0KCgpLQ0xfaHVtYW5bKERlbHRhUHNpPD0tMC4xICYgUHJvYmFiaWxpdHk+MC45KSwgRGVsdGFfdHlwZTo9IkluY2x1ZGVkIl0KS0NMX2h1bWFuWyhEZWx0YVBzaT49MC4xICYgUHJvYmFiaWxpdHk+MC45KSwgRGVsdGFfdHlwZTo9IlNraXBlZCJdCktDTF9odW1hbltpcy5uYShEZWx0YV90eXBlKSwgRGVsdGFfdHlwZTo9Ik5vbmUiXQpLQ0xfaHVtYW5fc3RhdHMgPC0gIEtDTF9odW1hbltUeXBlPT0iQ0UiICwgLihjb3VudD0uTiksIGJ5PWMoIkRlbHRhX3R5cGUiLCAiZXhvbiIsICJHNF9ib2wiKSBdIApLQ0xfaHVtYW5fc3RhdHNbLCB0b3RhbDo9c3VtKGNvdW50KSwgYnk9Ikc0X2JvbCJdCktDTF9odW1hbl9zdGF0c1ssIGZyYWN0aW9uOj1jb3VudC90b3RhbF0KCkZpZzUuQiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9iYXIoZGF0YT1LQ0xfaHVtYW5fc3RhdHNbRGVsdGFfdHlwZSE9Ik5vbmUiICYgZXhvbj09ImV4b24iLCBdICwgYWVzKHg9IEc0X2JvbCwgeT1mcmFjdGlvbiwgZ3JvdXA9RGVsdGFfdHlwZSwgZmlsbD1EZWx0YV90eXBlICkgLCBwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIgICkgKwogIHhsYWIoIiIpICsKICB5bGFiKCJGcmFjdGlvbiBvZiBkaWZmZXJlbnRpYWxseSBpbmNsdWVkIGV4b25zICIpICsKICB0aGVtZV9idygpICsKICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9IkFsdGVybmF0aXZlIHNwbGljaW5nIGV2ZW50IikpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCkZpZzUuQgoKYGBgCgoKCmBgYHtyfQoKCmRpZmYudXAgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIikKZGlmZi5kb3duIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIikKZXFsLnVwIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIikKZXFsLmRvd24gPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIpCgoKZGlmZi51cFssIGA6PWAodHlwZT0iZGlmZiIsIHBvcz0idXAiICldCmRpZmYuZG93blssIGA6PWAodHlwZT0iZGlmZiIsIHBvcz0iZG93biIgKV0KZXFsLnVwWywgYDo9YCh0eXBlPSJlcWwiLCBwb3M9InVwIiApXQplcWwuZG93blssIGA6PWAodHlwZT0iZXFsIiwgcG9zPSJkb3duIiApXQoKCmRpZmZfZXFsIDwtICByYmluZChkaWZmLnVwLCAgZGlmZi5kb3duLCBlcWwudXAsIGVxbC5kb3duKQoKCmdncGxvdChkaWZmX2VxbCkgKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbiwgeT1FbnJyaWNobWVudCwgZ3JvdXA9dHlwZSkpICsKICBmYWNldF9ncmlkKHBvcyB+IC4pICsKICB0aGVtZV9idygpIAoKYGBgCgoKCgpgYGB7cn0KCnBsb3RfZXFsX2RpZmYgPC0gZnVuY3Rpb24oZXFsX3VwX3BsdXMsIGVxbF91cF9taW51cywgZXFsX2Rvd25fcGx1cywgZXFsX2Rvd25fbWludXMsIGRpZmZfdXBfcGx1cywgZGlmZl91cF9taW51cywgZGlmZl9kb3duX3BsdXMsIGRpZmZfZG93bl9taW51cyAgICl7IAoKCmRpZmYudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl91cF9wbHVzKQpkaWZmLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX3VwX21pbnVzKQpkaWZmLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl9kb3duX3BsdXMpCmRpZmYuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl9kb3duX21pbnVzKQpkaWZmLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRpZmYuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCmRpZmYuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGRpZmYudXBfcGx1cywgZGlmZi51cF9taW51cywgZGlmZi5kb3duX3BsdXMsIGRpZmYuZG93bl9taW51cykKCgplcWwudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX3VwX3BsdXMpCmVxbC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX3VwX21pbnVzKQplcWwuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfZG93bl9wbHVzKQplcWwuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX2Rvd25fbWludXMpCmVxbC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQplcWwuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCmVxbC5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZXFsLnVwX3BsdXMsIGVxbC51cF9taW51cywgZXFsLmRvd25fcGx1cywgZXFsLmRvd25fbWludXMpCgpkaWZmLlRPVEFMWywgdHlwZTo9ImRpZmYiXQplcWwuVE9UQUxbLCB0eXBlOj0iZXFsIl0KCmRpZmZfZXFsLlRPVEFMIDwtIHJiaW5kKGRpZmYuVE9UQUwsIGVxbC5UT1RBTCkKCgpnZ3Bsb3QoZGlmZl9lcWwuVE9UQUwpICsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24sIHk9RW5ycmljaG1lbnQsIGNvbG9yPXR5cGUpKSArCiAgeGxpbShjKC0yNTAsMjUwKSkgKwogIGZhY2V0X2dyaWQoLiB+IGV4b25fcG9zICApICsKICBsYWJzKGNvbG91ciA9ICJQb3Rhc3NpdW0gZWZmZWN0IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCn0KYGBgCgoKCgoKCgoKCmBgYHtyfQoKCgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsIDwtIGZ1bmN0aW9uKGVxbF91cF9wbHVzLCBlcWxfdXBfbWludXMsIGVxbF9kb3duX3BsdXMsIGVxbF9kb3duX21pbnVzLCBkaWZmX3VwX3BsdXMsIGRpZmZfdXBfbWludXMsIGRpZmZfZG93bl9wbHVzLCBkaWZmX2Rvd25fbWludXMsIFRPVEFMLmVxbCwgVE9UQUwuZGlmZiwgc2lnICAgKXsgCgoKZGlmZi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX3VwX3BsdXMpCmRpZmYudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfdXBfbWludXMpCmRpZmYuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX2Rvd25fcGx1cykKZGlmZi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX2Rvd25fbWludXMpCmRpZmYudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZGlmZi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKZGlmZi5UT1RBTCA8LSBwbG90X2RlbnNpdHlfYmlub21pYWwoZGlmZi51cF9wbHVzLCBkaWZmLnVwX21pbnVzLCBkaWZmLmRvd25fcGx1cywgZGlmZi5kb3duX21pbnVzLCBUT1RBTC5kaWZmLCBzaWcpCgoKZXFsLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF91cF9wbHVzKQplcWwudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF91cF9taW51cykKZXFsLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX2Rvd25fcGx1cykKZXFsLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF9kb3duX21pbnVzKQplcWwudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXFsLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgplcWwuVE9UQUwgPC0gcGxvdF9kZW5zaXR5X2Jpbm9taWFsKGVxbC51cF9wbHVzLCBlcWwudXBfbWludXMsIGVxbC5kb3duX3BsdXMsIGVxbC5kb3duX21pbnVzLCBUT1RBTC5lcWwsIHNpZykKCmRpZmYuVE9UQUxbLCB0eXBlOj0iZGlmZiJdCmVxbC5UT1RBTFssIHR5cGU6PSJlcWwiXQoKZGlmZl9lcWwuVE9UQUwgPC0gcmJpbmQoZGlmZi5UT1RBTCwgZXFsLlRPVEFMKQoKCmdncGxvdChkaWZmX2VxbC5UT1RBTCkgKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbiwgeT1FbnJyaWNobWVudCwgY29sb3I9dHlwZSkpICsKICAgZ2VvbV9yaWJib24oYWVzKHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91LCB4PVBvc2l0aW9uLCBmaWxsPXR5cGUpLCBhbHBoYT0wLjMgKSsKICB4bGltKGMoLTI1MCwyNTApKSArCiAgZmFjZXRfZ3JpZCguIH4gZXhvbl9wb3MgICkgKwogIGxhYnMoY29sb3VyID0gIlBvdGFzc2l1bSBlZmZlY3QiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzY2OTkwMCIsICJncmV5IikpICsgIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzY2OTkwMCIsICJkYXJrZ3JleSIpKQoKCgoKfQpgYGAKCgoKYGBge3J9CktDTF9odW1hbiA8LSBmcmVhZCgiLi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZiIsIHNlcD0iXHQiKQpLQ0xfaHVtYW4gPC0gS0NMX2h1bWFuWywgMToxMV0KY29sbmFtZXMoS0NMX2h1bWFuKSA8LSBjKCJHZW5lIiwiTm9kZSIsICJDb29yZCIsICJTdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJDb21wbGV4aXR5IiwgIkVudHJvcHkiKQpodW1hbi5DRS5OQSA8LSBucm93KEtDTF9odW1hblsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKaHVtYW4uQ0UuZGlmZiA8LSBucm93KEtDTF9odW1hblthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgIFR5cGU9PSJDRSJdKQoKCktDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxIDwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX0VTQ19kZXJpdmVkX25ldXJvbl9DRDEgIDwtIEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxIFssIDE6MTFdCmNvbG5hbWVzKEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSA8LSBucm93KEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxIFsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmIDwtIG5yb3coS0NMX0VTQ19kZXJpdmVkX25ldXJvbl9DRDFbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgoKCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgIDwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZiIsIHNlcD0iXHQiKQpLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxICA8LSBLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxIFssIDE6MTFdCmNvbG5hbWVzKEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgKSA8LSBjKCJHZW5lIiwiTm9kZSIsICJDb29yZCIsICJTdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJDb21wbGV4aXR5IiwgIkVudHJvcHkiKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuTkEgPC0gbnJvdyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxIFsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLmRpZmYgPC0gbnJvdyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxIFthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgIFR5cGU9PSJDRSJdKQoKCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSAgPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxICA8LSBLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEgWywgMToxMV0KY29sbmFtZXMoS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuTkEgPC0gbnJvdyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEgWyhhYnMoRGVsdGFQc2kpPDAuMSB8IFByb2JhYmlsaXR5PDAuOSkgICYgIFR5cGU9PSJDRSJdKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5kaWZmIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxIFthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgIFR5cGU9PSJDRSJdKQoKCgpLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxICA8LSBmcmVhZCgiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSAgPC0gS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSBbLCAxOjExXQpjb2xuYW1lcyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSBbKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5kaWZmIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgIFR5cGU9PSJDRSJdKQoKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgogcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLApodW1hbi5DRS5OQSwKaHVtYW4uQ0UuZGlmZiwKMC4wNQopCgoKYGBgCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLk5BLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLmRpZmYsCjAuMDUpCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5kaWZmLAowLjA1KQpgYGAKCgoKCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLmRpZmYsCjAuMDUKKQpgYGAKCgoKCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5kaWZmLAowLjA1KQpgYGAKCgoKCgoKCiMjIyBHNHNlcSAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2VxbF9kaWZmKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLCAKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iCgopCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkZpZzUuQyA8LSBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLCAKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApodW1hbi5DRS5OQSwKaHVtYW4uQ0UuZGlmZiwKMC4wNSkKCgpGaWc1LmMgPC0gRmlnNS5DICt5bGltKCBjKDAuNCwgMi4xKSkKCkZpZzUuYwpgYGAKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgoKRmlnNS5EIDwtIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKaHVtYW4uQ0UuTkEsCmh1bWFuLkNFLmRpZmYsCjAuMDUKKQoKCkZpZzUuRCA8LSBGaWc1LkQgK3lsaW0oIGMoMC40LCAyLjEpKQpGaWc1LkQKYGBgCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKc3VwLm11cy5zc19lbnJpY2htZW50LkVTQy5LIDwtIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKc3VwLm11cy5zc19lbnJpY2htZW50LkVTQy5QRFMgIDwtIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKc3VwLm11cy5zc19lbnJpY2htZW50LkRJVjEwX0NEMS5LIDwtIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLmRpZmYsCjAuMDUKKQoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpzdXAubXVzLnNzX2VucmljaG1lbnQuRElWMTBfQ0QxLlBEUyA8LSBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5kaWZmLAowLjA1CikKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpzdXAubXVzLnNzX2VucmljaG1lbnQuRElWMTBfVGMxLksgPC0gcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKc3VwLm11cy5zc19lbnJpY2htZW50LkRJVjEwX1RjMS5QRFMgPC0gcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKc3VwLm11cy5zc19lbnJpY2htZW50LkRJVjRfQ0QxLksgPC0gcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKc3VwLm11cy5zc19lbnJpY2htZW50LkRJVjRfQ0QxLlBEUyA8LSBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLmRpZmYsCjAuMDUKKQoKYGBgCgoKIyMjIHNtb290aCAjIyMKCgoKCmBgYHtyfQoKcmVwKDE6MTk5OSwgZWFjaD00KQoKZGlmZl9lcWwuVE9UQUxbICwgYmluOj1yZXAoMToxOTk5LCBlYWNoPTQpIF0KCgpkaWZmX2VxbC5UT1RBTFssIG1lYW5fRW5ycmljaG1lbnQ6PW1lYW4oRW5ycmljaG1lbnQpICwgYnk9YmluXQoKCmdncGxvdChkaWZmX2VxbC5UT1RBTCkgKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbiwgeT1tZWFuX0VucnJpY2htZW50LCBjb2xvcj10eXBlKSkgKwogIHhsaW0oYygtMjUwLDI1MCkpICsKICBmYWNldF9ncmlkKC4gfiBleG9uX3BvcyAgKSArCiAgbGFicyhjb2xvdXIgPSAiUG90YXNzaXVtIGVmZmVjdCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCmBgYAoKCiNJbnRyb24gbGVuZ2h0CgoKYGBge3J9CmludHJvbl91cHN0cmVhbSA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUzL0ludHJvbnMuaGcxOV91cHN0cmVhbV8xMDBudF93aW5kb3cuYmVkLmludGVyc2VjdF9jLkc0cyIpCmludHJvbl9kb3duc3RyZWFtIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTMvSW50cm9ucy5oZzE5X2Rvd25zdHJlYW1fMTAwbnRfd2luZG93LmJlZC5pbnRlcnNlY3RfYy5HNHMiKQoKY29sbmFtZXMoaW50cm9uX3Vwc3RyZWFtKSA8LSBjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIklEIiwgImludHJvbl9zaXplIiwgInRyYW5zY3JpcHQiLCAiRzQiKQpjb2xuYW1lcyhpbnRyb25fZG93bnN0cmVhbSkgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJJRCIsICJpbnRyb25fc2l6ZSIsICJ0cmFuc2NyaXB0IiwgIkc0IikKCmludHJvbl91cHN0cmVhbVssIHBvczo9IlVwc3RyZWFtIGludHJvbiJdCmludHJvbl9kb3duc3RyZWFtWywgcG9zOj0iRG93bnN0cmVhbSBpbnRyb24iXQoKaW50cm9uX3NpemUgPC0gIHJiaW5kKGludHJvbl91cHN0cmVhbSwgaW50cm9uX2Rvd25zdHJlYW0pCmludHJvbl9zaXplJHBvcyA8LSBmYWN0b3IoaW50cm9uX3NpemUkcG9zLCBsZXZlbD1jKCJVcHN0cmVhbSBpbnRyb24iLCAiRG93bnN0cmVhbSBpbnRyb24iKSkKCgpGaWczLkIgPC0gZ2dwbG90KGludHJvbl9zaXplKSArCiAgZ2VvbV9saW5lKGFlcyhpbnRyb25fc2l6ZSwgY29sb3VyPUc0PjApLCBzdGF0PSJkZW5zaXR5IikgKwogIGZhY2V0X2dyaWQoLiB+IHBvcykgKwogIHhsaW0oYygwLDUwMDApKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpGaWczLkIKYGBgCgpgYGB7cn0Ka3MudGVzdChpbnRyb25fc2l6ZVtHND4wLCBpbnRyb25fc2l6ZV0sIGludHJvbl9zaXplW0c0PT0wLCBpbnRyb25fc2l6ZV0pCmBgYAoKCgpgYGB7cn0Kc2l6ZV9pbnQgPC0gYyhzZXEoMCw1MDAwLDEwKSwgYygxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCkpCgoKaW50cm9uX3NpemUkaW50X2NvdW50IDwtIGN1dChpbnRyb25fc2l6ZSRpbnRyb25fc2l6ZSwgc2l6ZV9pbnQpCgoKaW50X2NvdW50c191cF93X0c0IDwtIHRhYmxlKGludHJvbl9zaXplW3Bvcz09IlVwc3RyZWFtIGludHJvbiIgJiBHND4wLCBdJGludF9jb3VudCkKaW50X2NvdW50c191cF93b19HNCA8LSB0YWJsZShpbnRyb25fc2l6ZVtwb3M9PSJVcHN0cmVhbSBpbnRyb24iICYgRzQ9PTAsIF0kaW50X2NvdW50KQppbnRfY291bnRzX3VwIDwtIHJiaW5kKGludF9jb3VudHNfdXBfd19HNCwgaW50X2NvdW50c191cF93b19HNCkKY29sbmFtZXMoaW50X2NvdW50c191cCkgPC0gYyhzZXEoMTAsNTAwMCwxMCksIGMoMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDApKQppbnRfY291bnRzX3VwIDwtIG1lbHQoaW50X2NvdW50c191cCkKCgppbnRfY291bnRzX2Rvd25fd19HNCA8LSB0YWJsZShpbnRyb25fc2l6ZVtwb3M9PSJEb3duc3RyZWFtIGludHJvbiIgJiBHND4wLCBdJGludF9jb3VudCkKaW50X2NvdW50c19kb3duX3dvX0c0IDwtIHRhYmxlKGludHJvbl9zaXplW3Bvcz09IkRvd25zdHJlYW0gaW50cm9uIiAmIEc0PT0wLCBdJGludF9jb3VudCkKaW50X2NvdW50c19kb3duIDwtIHJiaW5kKGludF9jb3VudHNfZG93bl93X0c0LCBpbnRfY291bnRzX2Rvd25fd29fRzQpCmNvbG5hbWVzKGludF9jb3VudHNfZG93bikgPC0gYyhzZXEoMTAsNTAwMCwxMCksIGMoMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDApKQppbnRfY291bnRzX2Rvd24gPC0gbWVsdChpbnRfY291bnRzX2Rvd24pCgppbnRyb25fc2l6ZV9pbnRzIDwtIHJiaW5kKGludF9jb3VudHNfdXAsIGludF9jb3VudHNfZG93bikKCmNvbG5hbWVzKGludHJvbl9zaXplX2ludHMpIDwtIGMoImZhY3RvciIsICJpbnQiLCAiY291bnQiKQoKaW50cm9uX3NpemVfaW50cyA8LSBkYXRhLnRhYmxlKGludHJvbl9zaXplX2ludHMpCgoKaW50cm9uX3NpemVfaW50c1sgLCB0b3RhbDo9c3VtKGNvdW50KSAsIGJ5PSJmYWN0b3IiIF0KaW50cm9uX3NpemVfaW50c1sgLCBmcmFjOj0oY291bnQvdG90YWwpIF0KCmludHJvbl9zaXplX2ludHNfdXAgPC0gbWVyZ2UoaW50cm9uX3NpemVfaW50c1sgZmFjdG9yPT0iaW50X2NvdW50c191cF93X0c0IiwgXSwgaW50cm9uX3NpemVfaW50c1sgZmFjdG9yPT0iaW50X2NvdW50c191cF93b19HNCIsIF0sIGJ5PSJpbnQiICkKaW50cm9uX3NpemVfaW50c191cFsgLCByZWxhdGl2ZV9mcmFjOj1mcmFjLngvZnJhYy55IF0KCmludHJvbl9zaXplX2ludHNfZG93biA8LSBtZXJnZShpbnRyb25fc2l6ZV9pbnRzWyBmYWN0b3I9PSJpbnRfY291bnRzX2Rvd25fd19HNCIsIF0sIGludHJvbl9zaXplX2ludHNbIGZhY3Rvcj09ImludF9jb3VudHNfZG93bl93b19HNCIsIF0sIGJ5PSJpbnQiICkKaW50cm9uX3NpemVfaW50c19kb3duWyAsIHJlbGF0aXZlX2ZyYWM6PWZyYWMueC9mcmFjLnkgXQoKaW50cm9uX3NpemVfaW50c191cFssIHBvczo9IlVwc3RyZWFtIGludHJvbiJdCmludHJvbl9zaXplX2ludHNfZG93blssIHBvczo9IkRvd25zdHJlYW0gaW50cm9uIl0KCmludHJvbl9zaXplX2ludHNfdG90YWwgPC0gcmJpbmQoaW50cm9uX3NpemVfaW50c191cCwgaW50cm9uX3NpemVfaW50c19kb3duKQoKaW50cm9uX3NpemVfaW50c190b3RhbCRwb3MgPC0gZmFjdG9yKGludHJvbl9zaXplX2ludHNfdG90YWwkcG9zLCBsZXZlbD1jKCJVcHN0cmVhbSBpbnRyb24iLCAiRG93bnN0cmVhbSBpbnRyb24iKSkKCgoKRmlnMy5DIDwtIGdncGxvdChpbnRyb25fc2l6ZV9pbnRzX3RvdGFsLCBhZXMoaW50LCBsb2cyKHJlbGF0aXZlX2ZyYWMpKSAgKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBzdGF0X3Ntb290aCggbWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBwb2x5KHgsIDgpKSArCiAgeGxpbShjKDAsIDIwMDApKSArCiAgeWxpbShjKC0yLDIpKSArCiAgZmFjZXRfZ3JpZCguIH4gcG9zKQoKRmlnMy5DCgpgYGAKCgoKYGBge3J9CgppbnRyb25fc2l6ZV9pbnRzX3RvdGFsWyByZWxhdGl2ZV9mcmFjICVpbiUgaW50cm9uX3NpemVfaW50c190b3RhbFssIG1heChyZWxhdGl2ZV9mcmFjKSwgYnk9cG9zXSRWMSwgXQoKYGBgCgoKCmBgYHtyfQogVXBzdHJlYW1fVTJfc2NvcmVfbGVuIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTMvVXBzdHJlYW1fVTJfc2NvcmVfbGVuX21hdHJpeC50eHQyLm9sZCIpCiBEb3duc3RyZWFtX1UyX3Njb3JlX2xlbiA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUzL0Rvd25zdHJlYW1fVTJfc2NvcmVfbGVuX21hdHJpeC50eHQyLm9sZCIpCiAKIAogVXBzdHJlYW1fVTJfc2NvcmVfbGVuIDwtZGF0YS50YWJsZTo6bWVsdChVcHN0cmVhbV9VMl9zY29yZV9sZW4sIGlkLnZhcnM9J0lMJykKRG93bnN0cmVhbV9VMl9zY29yZV9sZW4gPC0gZGF0YS50YWJsZTo6bWVsdChEb3duc3RyZWFtX1UyX3Njb3JlX2xlbiwgaWQudmFycz0nSUwnKQoKVXBzdHJlYW1fVTJfc2NvcmVfbGVuWywgcG9zOj0iVXBzdHJlYW0gaW50cm9uIl0KRG93bnN0cmVhbV9VMl9zY29yZV9sZW5bLCBwb3M6PSJEb3duc3RyZWFtIGludHJvbiJdCgoKIApGaWczLkQxIDwtICBnZ3Bsb3QoVXBzdHJlYW1fVTJfc2NvcmVfbGVuKSArCiAgIGdlb21fdGlsZSggYWVzKHZhcmlhYmxlLCBhcy5mYWN0b3IoSUwpLCBmaWxsID0gdmFsdWUqMTAwKSkgKwogICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMTIuNSwgbGltaXRzID0gYygwLCAyNSkpICsKICAgZmFjZXRfZ3JpZCguIH4gcG9zKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgK2xhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKQogCiAKRmlnMy5EMiA8LSAgZ2dwbG90KERvd25zdHJlYW1fVTJfc2NvcmVfbGVuKSArCiAgIGdlb21fdGlsZSggYWVzKHZhcmlhYmxlLCBhcy5mYWN0b3IoSUwpLCBmaWxsID0gdmFsdWUqMTAwKSkgKwogICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMTIuNSwgbGltaXRzID0gYygwLCAyNSkpICsKICAgZmFjZXRfZ3JpZCguIH4gcG9zKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgK2xhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKQoKRmlnMy5EIDwtIHBsb3RfZ3JpZChGaWczLkQxLCBGaWczLkQyKQogRmlnMy5ECmBgYAoKCgoKYGBge3J9CgpjbG9zZXN0X2c0IDwtIGZ1bmN0aW9uKGRpc3QuZXhvbl91cF9wbHVzX3BhdGgsIGRpc3QuZXhvbl91cF9taW51c19wYXRoLCBkaXN0LmV4b25fZG93bl9wbHVzX3BhdGgsIGRpc3QuZXhvbl9kb3duX21pbnVzX3BhdGgpewoKZGlzdC5leG9uX3VwX3BsdXMgPC0gZnJlYWQoZGlzdC5leG9uX3VwX3BsdXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX3VwX3BsdXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl91cF9wbHVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX3VwX3BsdXNbICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCgoKZGlzdC5leG9uX3VwX21pbnVzIDwtIGZyZWFkKGRpc3QuZXhvbl91cF9taW51c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fdXBfbWludXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl91cF9taW51c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl91cF9taW51c1sgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKZGlzdC5leG9uX2Rvd25fcGx1cyA8LSBmcmVhZChkaXN0LmV4b25fZG93bl9wbHVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl9kb3duX3BsdXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl9kb3duX3BsdXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fZG93bl9wbHVzWyAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQoKCmRpc3QuZXhvbl9kb3duX21pbnVzIDwtIGZyZWFkKGRpc3QuZXhvbl9kb3duX21pbnVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl9kb3duX21pbnVzKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIpCgpkaXN0LmV4b25fZG93bl9taW51c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl9kb3duX21pbnVzWyAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpkaXN0LmV4b25fdXAgPC0gcmJpbmQoZGlzdC5leG9uX3VwX3BsdXMsIGRpc3QuZXhvbl91cF9taW51cykgCmRpc3QuZXhvbl9kb3duIDwtIHJiaW5kKGRpc3QuZXhvbl9kb3duX3BsdXMsIGRpc3QuZXhvbl9kb3duX21pbnVzKQoKZGlzdC5leG9uX3VwWywgcG9zOj0iMydTcGxpY2Ugc2l0ZSJdCmRpc3QuZXhvbl9kb3duWywgcG9zOj0iNSdTcGxpY2Ugc2l0ZSJdCgpkaXN0LmV4b24gPC0gcmJpbmQoZGlzdC5leG9uX3VwLCBkaXN0LmV4b25fZG93bikKCnJldHVybihkaXN0LmV4b24pCgp9CgoKCmBgYAoKCgpgYGB7cn0KZXhvbi51cC5tb3RpZiA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25zLnVwLmNsb3Nlc3RfRzRfY2xlYW4iKQpjb2xuYW1lcyhleG9uLnVwLm1vdGlmKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiKQoKZXhvbi51cC5tb3RpZlsgLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpleG9uLnVwLm1vdGlmWyAgc3RyYW5kPT0iKyIgICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCmV4b24udXAubW90aWZbICBzdHJhbmQ9PSItIiAgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKZXhvbi5kb3duLm1vdGlmIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbnMuZG93bi5jbG9zZXN0X0c0X2NsZWFuIikKY29sbmFtZXMoZXhvbi5kb3duLm1vdGlmKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiKQoKZXhvbi5kb3duLm1vdGlmWyAsIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmV4b24uZG93bi5tb3RpZlsgIHN0cmFuZD09IisiICAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQpleG9uLmRvd24ubW90aWZbICBzdHJhbmQ9PSItIiAgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKCmV4b24udXAubW90aWZbLCBwb3M6PSIzJ1NwbGljZSBzaXRlIl0KZXhvbi5kb3duLm1vdGlmWywgcG9zOj0iNSdTcGxpY2Ugc2l0ZSJdCgpleG9uLmRpc3QubW90aWYgPC0gcmJpbmQoZXhvbi51cC5tb3RpZiwgZXhvbi5kb3duLm1vdGlmKQoKCmdncGxvdChleG9uLmRpc3QubW90aWYpICsKICBnZW9tX2RlbnNpdHkoYWVzKGRpc3QpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoLiB+IHBvcykKIApgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03fQoKY2xvc2VzdF9nNF9LQ0wgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgoKCmNsb3Nlc3RfZzRfUERTIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0xbLCBUeXBlOj0iRzQtc2VxIEsrIl0KY2xvc2VzdF9nNF9QRFNbLCBUeXBlOj0iRzQtc2VxIFBEUyJdCmV4b24uZGlzdC5tb3RpZlssIFR5cGU6PSJDb25zZW5zdXMgRzQgbW90aWYiXQoKCmNsb3Nlc3RfZzRfS0NMIDwtIHVuaXF1ZShjbG9zZXN0X2c0X0tDTFsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAiVHlwZSIpXSkKY2xvc2VzdF9nNF9QRFMgPC0gdW5pcXVlKGNsb3Nlc3RfZzRfUERTWyAsIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJkaXN0IiwgInBvcyIsICAiVHlwZSIpXSkKZXhvbi5kaXN0Lm1vdGlmIDwtIHVuaXF1ZShleG9uLmRpc3QubW90aWZbICwgYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImRpc3QiLCAicG9zIiwgIlR5cGUiKV0pCgoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmIDwtIHJiaW5kKGNsb3Nlc3RfZzRfS0NMLCBjbG9zZXN0X2c0X1BEUywgZXhvbi5kaXN0Lm1vdGlmKQoKRmlnMS5CIDwtIGdncGxvdChjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYpICsKICBnZW9tX2RlbnNpdHkoYWVzKGRpc3QsIGNvbG91cj1UeXBlKSwgYnc9MTApICsKICB4bGltKGMoLTEwMDAsIDEwMDApKSArCiAgZmFjZXRfZ3JpZChUeXBlIH4gcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRGVuc2l0eSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCggYW5nbGUgPSA0NSkpIAoKRmlnMS5CICsgeGxpbShjKC0zMDAsIDMwMCkpCgpgYGAKCgoKCgoKYGBge3J9CgojY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmCgoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYiA8LSBjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWZbYWJzKGRpc3QpPD0xMDAwICwgXQoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYlssIGJpbjo9Y3V0KGRpc3QsIHNlcSgtMTAwMCwgMTAwMCwgNSksIGxhYmVscz0gc2VxKC05OTUsIDEwMDAsIDUpLCBpbmNsdWRlLmxvd2VzdD1UUlVFICkgXQoKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudCA8LSBjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiWyAsIC4oT2NjdXJyZW5jZXM9Lk4pICwgYnk9YygiZGlzdCIsICJwb3MiLCAiVHlwZSIpXQoKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudC5tZWRpYW4gPC0gIGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudFssIC4obWVkaWFuPW1lZGlhbihPY2N1cnJlbmNlcykpLCBieT1jKCAicG9zIiwgIlR5cGUiKSBdCgoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50IDwtIG1lcmdlKGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudCwgY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50Lm1lZGlhbiwgYnk9YyggInBvcyIsICJUeXBlIikpIAoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50WywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudFtUeXBlPT0iQ29uc2Vuc3VzIEc0IG1vdGlmIiwgVHlwZTo9Ikc0IG1vdGlmIiBdCgoKI2Nsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudFsgLCBiaW46PWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGJpbikpXQoKCmdncGxvdChjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQpICsKICBnZW9tX2xpbmUoYWVzKGRpc3QsIEVucnJpY2htZW50LCBjb2xvdXI9VHlwZSkpICsKICB4bGltKGMoLTEwMDAsIDEwMDApKSArCiAgZmFjZXRfZ3JpZChUeXBlIH4gcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRW5yaWNobWVudCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCggYW5nbGUgPSA0NSkpIAoKCgoKCgpgYGAKCgoKCmBgYHtyfQoKY2xvc2VzdF9nNF8yMDE1IDwtIGZ1bmN0aW9uKGRpc3QuZXhvbl91cF9wbHVzX3BhdGgsIGRpc3QuZXhvbl91cF9taW51c19wYXRoLCBkaXN0LmV4b25fZG93bl9wbHVzX3BhdGgsIGRpc3QuZXhvbl9kb3duX21pbnVzX3BhdGgpewoKZGlzdC5leG9uX3VwX3BsdXMgPC0gZnJlYWQoZGlzdC5leG9uX3VwX3BsdXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX3VwX3BsdXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX3BsdXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fdXBfcGx1c1sgLCAgZGlzdDo9Z21pZCAtIGVzdGFydF0KCgpkaXN0LmV4b25fdXBfbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX3VwX21pbnVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl91cF9taW51cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX3VwX21pbnVzWyAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpkaXN0LmV4b25fZG93bl9wbHVzIDwtIGZyZWFkKGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX2Rvd25fcGx1c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl9kb3duX3BsdXNbICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCgoKZGlzdC5leG9uX2Rvd25fbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fbWludXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl9kb3duX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX2Rvd25fbWludXNbICwgIGRpc3Q6PSBlc3RhcnQgLSBnbWlkXQoKCmRpc3QuZXhvbl91cCA8LSByYmluZChkaXN0LmV4b25fdXBfcGx1cywgZGlzdC5leG9uX3VwX21pbnVzKSAKZGlzdC5leG9uX2Rvd24gPC0gcmJpbmQoZGlzdC5leG9uX2Rvd25fcGx1cywgZGlzdC5leG9uX2Rvd25fbWludXMpCgpkaXN0LmV4b25fdXBbLCBwb3M6PSIzJ1NwbGljZSBzaXRlIl0KZGlzdC5leG9uX2Rvd25bLCBwb3M6PSI1J1NwbGljZSBzaXRlIl0KCmRpc3QuZXhvbiA8LSByYmluZChkaXN0LmV4b25fdXAsIGRpc3QuZXhvbl9kb3duKQoKcmV0dXJuKGRpc3QuZXhvbikKCn0KCgoKYGBgCgoKCgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30KCmNsb3Nlc3RfZzRfS0NMXzIwMTUgPC0gY2xvc2VzdF9nNF8yMDE1KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIikKCgoKY2xvc2VzdF9nNF9QRFNfMjAxNSA8LSBjbG9zZXN0X2c0XzIwMTUoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0xfMjAxNVssIFR5cGU6PSJHNC1zZXEgTmErIEsrIl0KY2xvc2VzdF9nNF9QRFNfMjAxNVssIFR5cGU6PSJHNC1zZXEgTmErIFBEUyJdCgoKCmNsb3Nlc3RfZzRfS0NMXzIwMTUgPC0gdW5pcXVlKGNsb3Nlc3RfZzRfS0NMXzIwMTVbICwgYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImRpc3QiLCAicG9zIiwgIlR5cGUiKV0pCmNsb3Nlc3RfZzRfUERTXzIwMTUgPC0gdW5pcXVlKGNsb3Nlc3RfZzRfUERTXzIwMTVbICwgYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImRpc3QiLCAicG9zIiwgICJUeXBlIildKQoKCgpjbG9zZXN0X2c0X0tDTF9QRFNfMjAxNSA8LSByYmluZChjbG9zZXN0X2c0X0tDTF8yMDE1LCBjbG9zZXN0X2c0X1BEU18yMDE1KQoKZ2dwbG90KGNsb3Nlc3RfZzRfS0NMX1BEU18yMDE1KSArCiAgZ2VvbV9saW5lKGFlcyhkaXN0LCBjb2xvdXI9VHlwZSksIGJ3PTEwLCBzdGF0PSJkZW5zaXR5IikgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFR5cGUgfiBwb3MpICsKICB4bGFiKCJEaXN0YW5jZSIpICsKICB5bGFiKCJEZW5zaXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZSA9IDQ1KSkgCgoKCmBgYAoKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD03fQpjbG9zZXN0X2c0X0tDTC5zYWNDZXIzIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKY2xvc2VzdF9nNF9QRFMuc2FjQ2VyMyA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5iZWQudGFpcjEwLmNsb3Nlc3QuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgpjbG9zZXN0X2c0X1BEUy50YWlyMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5iZWQudGFpcjEwLmNsb3Nlc3QuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5iZWQudGFpcjEwLmNsb3Nlc3QuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wuZGFuUmVyMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgoKY2xvc2VzdF9nNF9QRFMuZGFuUmVyMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuZGFuUmVyMTAuY2xvc2VzdC5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIikKCgpjbG9zZXN0X2c0X0tDTC5kbTYgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCgpjbG9zZXN0X2c0X1BEUy5kbTYgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLm1tMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMubW0xMC5jbG9zZXN0LkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKY2xvc2VzdF9nNF9QRFMubW0xMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMubW0xMC5jbG9zZXN0LkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMubW0xMC5jbG9zZXN0LkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIikKCgpjbG9zZXN0X2c0X0tDTC5oZzE5IDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKY2xvc2VzdF9nNF9QRFMuaGcxOSA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCgpjbG9zZXN0X2c0X0tDTC5jZTEwIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzhfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzN19DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzdfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzN19DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKCmNsb3Nlc3RfZzRfUERTLmNlMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzOF9DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzOF9DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKCiAgCgoKY2xvc2VzdF9nNF9LQ0wuc2FjQ2VyM1ssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJTLiBjZXJldmlzaWFlIikgXQpjbG9zZXN0X2c0X1BEUy5zYWNDZXIzWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9IlMuIGNlcmV2aXNpYWUiKSBdCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMFssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJBLiB0aGFsaWFuYSIgKSBdCmNsb3Nlc3RfZzRfUERTLnRhaXIxMFssIGA6PWAoVHJlYXRtZW50PSJQRFMiLCBTcGVjaWVzPSJBLiB0aGFsaWFuYSIgKSBdCmNsb3Nlc3RfZzRfS0NMLmRhblJlcjEwWywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9IkQuIHJlcmlvIiAgKSBdCmNsb3Nlc3RfZzRfUERTLmRhblJlcjEwWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9IkQuIHJlcmlvIiAgKSBdCmNsb3Nlc3RfZzRfS0NMLmRtNlssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSAiRC4gbWVsYW5vZ2FzdGVyIiApIF0KY2xvc2VzdF9nNF9QRFMuZG02WywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9ICAiRC4gbWVsYW5vZ2FzdGVyIiApIF0KY2xvc2VzdF9nNF9LQ0wubW0xMFssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJNLiBtdXNjdWx1cyIgICkgXQpjbG9zZXN0X2c0X1BEUy5tbTEwWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9Ik0uIG11c2N1bHVzIiAgKSBdCmNsb3Nlc3RfZzRfS0NMLmhnMTlbLCBgOj1gKFRyZWF0bWVudD0iS0NsIiwgU3BlY2llcz0iSC4gc2FwaWVucyIgICAgKSBdCmNsb3Nlc3RfZzRfUERTLmhnMTlbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iSC4gc2FwaWVucyIgICAgKSBdCmNsb3Nlc3RfZzRfS0NMLmNlMTBbLCBgOj1gKFRyZWF0bWVudD0iS0NsIiwgU3BlY2llcz0iQy4gZWxlZ2FucyIgICAgKSBdCmNsb3Nlc3RfZzRfUERTLmNlMTBbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iQy4gZWxlZ2FucyIgICApIF0KCgpjbG9zZXN0X2c0LlRPVEFMIDwtIHJiaW5kKGNsb3Nlc3RfZzRfS0NMLnNhY0NlcjMsCmNsb3Nlc3RfZzRfUERTLnNhY0NlcjMsCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMCwKY2xvc2VzdF9nNF9QRFMudGFpcjEwLApjbG9zZXN0X2c0X0tDTC5kYW5SZXIxMCwKY2xvc2VzdF9nNF9QRFMuZGFuUmVyMTAsCmNsb3Nlc3RfZzRfS0NMLmRtNiwKY2xvc2VzdF9nNF9QRFMuZG02LApjbG9zZXN0X2c0X0tDTC5tbTEwLApjbG9zZXN0X2c0X1BEUy5tbTEwLApjbG9zZXN0X2c0X0tDTC5oZzE5LApjbG9zZXN0X2c0X1BEUy5oZzE5LApjbG9zZXN0X2c0X0tDTC5oZzE5LApjbG9zZXN0X2c0X1BEUy5oZzE5KQoKCmdncGxvdChjbG9zZXN0X2c0LlRPVEFMKSArCiAgZ2VvbV9saW5lKGFlcyhkaXN0LCBjb2xvdXI9U3BlY2llcyksIGJ3PTEwLCBzdGF0PSJkZW5zaXR5IikgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFRyZWF0bWVudCB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43LCAKICAgIGFuZ2xlID0gNDUpKSAKCgoKCmBgYAoKCgpgYGB7cn0KY2xvc2VzdF9nNC5UT1RBTC4xa2IgPC0gY2xvc2VzdF9nNC5UT1RBTFthYnMoZGlzdCk8PTEwMDAgLCBdCgpjbG9zZXN0X2c0LlRPVEFMLjFrYlssIGJpbjo9Y3V0KGRpc3QsIHNlcSgtMTAwMCwgMTAwMCwgNSksIGxhYmVscz0gc2VxKC05OTUsIDEwMDAsIDUpICkgXQoKCmNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQgPC0gY2xvc2VzdF9nNC5UT1RBTC4xa2JbICwgLihPY2N1cnJlbmNlcz0uTikgLCBieT1jKCJiaW4iLCAicG9zIiwgIlRyZWF0bWVudCIsICJTcGVjaWVzIildCgoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudC5tZWRpYW4gPC0gIGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnRbLCAuKG1lZGlhbj1tZWRpYW4oT2NjdXJyZW5jZXMpKSwgYnk9YyggInBvcyIsICJUcmVhdG1lbnQiLCAiU3BlY2llcyIpIF0KCgpjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50IDwtIG1lcmdlKGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQsIGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQubWVkaWFuLCBieT1jKCAicG9zIiwgIlRyZWF0bWVudCIsICJTcGVjaWVzIikpIAoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCgoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudFsgLCBiaW46PWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGJpbikpXQoKCkZpZzYuRCA8LSBnZ3Bsb3QoY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudCkgKwogIGdlb21fbGluZShhZXMoYmluLCBFbnJyaWNobWVudCwgY29sb3VyPVNwZWNpZXMpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHJlYXRtZW50IH4gcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRW5yaWNobWVudCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpIAoKRmlnNi5ECgpgYGAKCgoKCgpgYGB7cn0KCgoKcmVhZF9kaXN0X3RhYmxlX3BsdXNfbWludXMgPC0gZnVuY3Rpb24ocGF0aC5wbHVzLCBwYXRoLm1pbnVzICl7CiAgCmRpc3RfdGFibGUucGx1cyA8LSBkYXRhLnRhYmxlKHJlYWRfZGVsaW0ocGF0aC5wbHVzLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpKQoKZGlzdF90YWJsZS5wbHVzIDwtIGRpc3RfdGFibGUucGx1c1ssIDI6MjAwMV0KZGlzdF90YWJsZS5wbHVzIDwtIGRhdGEudGFibGUoYXMuZGF0YS5mcmFtZSh0KGRpc3RfdGFibGUucGx1cykpKQpjb2xuYW1lcyhkaXN0X3RhYmxlLnBsdXMpIDwtIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIikKCgpkaXN0X3RhYmxlLm1pbnVzIDwtIGRhdGEudGFibGUocmVhZF9kZWxpbShwYXRoLm1pbnVzLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpKQoKZGlzdF90YWJsZS5taW51cyA8LSBkaXN0X3RhYmxlLm1pbnVzWywgMjoyMDAxXQpkaXN0X3RhYmxlLm1pbnVzIDwtIGRhdGEudGFibGUoYXMuZGF0YS5mcmFtZSh0KGRpc3RfdGFibGUubWludXMpKSkKY29sbmFtZXMoZGlzdF90YWJsZS5taW51cykgPC0gYygiUG9zaXRpb24iLCAiT2NjdXJyZW5jZXMiKQoKIApkaXN0X3RhYmxlIDwtICBtZXJnZShkaXN0X3RhYmxlLnBsdXMsIGRpc3RfdGFibGUubWludXMsIGJ5PSJQb3NpdGlvbiIpCgpkaXN0X3RhYmxlWywgT2NjdXJyZW5jZXM6PShPY2N1cnJlbmNlcy54ICsgT2NjdXJyZW5jZXMueSldCgpkaXN0X3RhYmxlWywgT2NjdXJyZW5jZXM6PShPY2N1cnJlbmNlcy54ICsgT2NjdXJyZW5jZXMueSldCmRpc3RfdGFibGUgPC0gZGlzdF90YWJsZVssIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIildCgoKZGlzdF90YWJsZVssbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpXQpkaXN0X3RhYmxlWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KZGlzdF90YWJsZVssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQoKcmV0dXJuKGRpc3RfdGFibGUpICAKfQoKCmBgYAoKCgoKCgoKYGBge3J9CgplbnJpY2htZW50X0c0X3NlcV9wbG90IDwtIGZ1bmN0aW9uKHBhdGgudXBfcGx1cy5wbHVzLCBwYXRoLnVwX3BsdXMubWludXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZG93bl9wbHVzLnBsdXMsIHBhdGguZG93bl9wbHVzLm1pbnVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnVwX21pbnVzLnBsdXMsIHBhdGgudXBfbWludXMubWludXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kb3duX21pbnVzLnBsdXMsIHBhdGguZG93bl9taW51cy5taW51cyApewoKCngudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyhwYXRoLnVwX3BsdXMucGx1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC51cF9wbHVzLm1pbnVzKQoKCnguZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZV9wbHVzX21pbnVzKHBhdGguZG93bl9wbHVzLnBsdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZG93bl9wbHVzLm1pbnVzKQoKCngudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlX3BsdXNfbWludXMocGF0aC51cF9taW51cy5wbHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnVwX21pbnVzLm1pbnVzKQoKCnguZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyhwYXRoLmRvd25fbWludXMucGx1cywKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmRvd25fbWludXMubWludXMpCgoKeC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQp4LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnguVE9UQUwgPC0gcGxvdF9kZW5zaXR5KHgudXBfcGx1cywgeC51cF9taW51cywgeC5kb3duX3BsdXMsIHguZG93bl9taW51cykKCnJldHVybih4LlRPVEFMKQoKfQoKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKaGcxOS5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKaGcxOS5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgoKCnNhY0NlcjMuVE9UQUwuS0NMIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgpzYWNDZXIzLlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCgptb3VzZS5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCm1vdXNlLlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKIAoKCmRtNi5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKZG02LlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgoKCgp0YWlyMTAuVE9UQUwuS0NMIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkX3RhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZF90YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgp0YWlyMTAuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZF90YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZF90YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgoKCmRhblJlcjEwLlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCgpkYW5SZXIxMC5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZzE5LlRPVEFMLktDTFssIFRyZWF0bWVudDo9IktDbCJdIApoZzE5LlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCmhnMTkuVE9UQUwuS0NMWywgU3BlY2llczo9IkguIHNhcGllbnMiXSAKaGcxOS5UT1RBTC5QRFNbLCBTcGVjaWVzOj0iSC4gc2FwaWVucyJdICAKCnNhY0NlcjMuVE9UQUwuS0NMWywgVHJlYXRtZW50Oj0iS0NsIl0gIApzYWNDZXIzLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCnNhY0NlcjMuVE9UQUwuS0NMWywgU3BlY2llczo9IlMuIGNlcmV2aXNpYWUiXSAgCnNhY0NlcjMuVE9UQUwuUERTWywgU3BlY2llczo9IlMuIGNlcmV2aXNpYWUiXSAgCgptb3VzZS5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCm1vdXNlLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdIAptb3VzZS5UT1RBTC5LQ0xbLCBTcGVjaWVzOj0iTS4gbXVzY3VsdXMiXSAgCm1vdXNlLlRPVEFMLlBEU1ssIFNwZWNpZXM6PSJNLiBtdXNjdWx1cyJdICAKCmRtNi5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCmRtNi5UT1RBTC5QRFNbLCBUcmVhdG1lbnQ6PSJQRFMiXQpkbTYuVE9UQUwuS0NMWywgU3BlY2llczo9IkQuIG1lbGFub2dhc3RlciJdICAKZG02LlRPVEFMLlBEU1ssIFNwZWNpZXM6PSJELiBtZWxhbm9nYXN0ZXIiXSAgCgp0YWlyMTAuVE9UQUwuS0NMWywgVHJlYXRtZW50Oj0iS0NsIl0gCnRhaXIxMC5UT1RBTC5QRFNbLCBUcmVhdG1lbnQ6PSJQRFMiXSAKdGFpcjEwLlRPVEFMLktDTFssIFNwZWNpZXM6PSJBLiB0aGFsaWFuYSJdIAp0YWlyMTAuVE9UQUwuUERTWywgU3BlY2llczo9IkEuIHRoYWxpYW5hIl0gCgpkYW5SZXIxMC5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCmRhblJlcjEwLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCmRhblJlcjEwLlRPVEFMLktDTFssIFNwZWNpZXM6PSJELiByZXJpbyJdICAKZGFuUmVyMTAuVE9UQUwuUERTWywgU3BlY2llczo9IkQuIHJlcmlvIl0KCgpUT1RBTC5LQ0xfUERTIDwtICByYmluZChoZzE5LlRPVEFMLktDTCwgaGcxOS5UT1RBTC5QRFMsIHNhY0NlcjMuVE9UQUwuS0NMLCBzYWNDZXIzLlRPVEFMLlBEUywgbW91c2UuVE9UQUwuS0NMLCBtb3VzZS5UT1RBTC5QRFMsIGRtNi5UT1RBTC5LQ0wsIGRtNi5UT1RBTC5QRFMsIHRhaXIxMC5UT1RBTC5LQ0wsIHRhaXIxMC5UT1RBTC5QRFMsIGRhblJlcjEwLlRPVEFMLktDTCwgZGFuUmVyMTAuVE9UQUwuUERTKQoKCmdncGxvdChUT1RBTC5LQ0xfUERTKSArCiAgZ2VvbV9saW5lKGFlcyhQb3NpdGlvbiwgRW5ycmljaG1lbnQsIGNvbG91cj1TcGVjaWVzKSkgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFRyZWF0bWVudCB+IGV4b25fcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRW5yaWNobWVudCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpIAoKYGBgCgoKCgoKCgpgYGB7cn0KY2xvc2VzdF9nNF9LQ0wuaGcxOS4yMDE1IDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL1N1cHBsZW1lbnRhcnkvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLmhnMTkuMjAxNSA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL1N1cHBsZW1lbnRhcnkvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL1N1cHBsZW1lbnRhcnkvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL1N1cHBsZW1lbnRhcnkvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIikKYGBgCgoKCmBgYHtyfQpLQ0xfdXAgPC0gdW5pcXVlKGNsb3Nlc3RfZzRfS0NMW2FicyhkaXN0KT49MTAwICYgcG9zPT0iMydTcGxpY2Ugc2l0ZSIsIHBhc3RlKGVjaHJvbSwgZXN0YXJ0LCBlZW5kLCBzZXAgPSAiXyIpXSkKCgpgYGAKCgoKCgoKCgpgYGB7cn0KZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsKICBodWVzID0gc2VxKDE1LCAzNzUsIGxlbmd0aCA9IG4gKyAxKQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dCn0KCmdnX2NvbG9yX2h1ZSgzKQpgYGAKCgpgYGB7cn0KCgogbGlicmFyeShldWxlcnIpCgoKCgpWZW5uRGlhZy51cCA8LSBldWxlcihjKCJNb3RpZiIgPSA4ODA3KzkzMjUsICAKICAgICAgICAgICAgICAgICAgICAiSyIgPSA5NjUzKzEwMDI5LCAgCiAgICAgICAgICAgICAgICAgICAgIlBEUyIgPSAzNDg4MCszNjkwOSwgCiAgICAgICAgICAgICAgICAgICAgIksmUERTIiA9IDk4OTArOTUzOSwKICAgICAgICAgICAgICAgICAgICAiUERTJk1vdGlmIiA9IDgzMzErODg1NSwKICAgICAgICAgICAgICAgICAgICAiSyZNb3RpZiIgPSA0NTA5KzQ3NDksCiAgICAgICAgICAgICAgICAgICAgIksmUERTJk1vdGlmIiA9IDQ1MDMrNDc0NykpCkZpZzEuQzEgPC0gcGxvdChWZW5uRGlhZy51cCwgY291bnRzID0gVFJVRSwgZm9udD0yLCBjZXg9MSwgYWxwaGE9MC41LAogICAgIGZpbGw9Z2dfY29sb3JfaHVlKDMpLCBxdWFudGl0aWVzID0gbGlzdChmb250c2l6ZSA9IDEwKSkKCgpWZW5uRGlhZy5kb3duIDwtIGV1bGVyKGMoIk1vdGlmIiA9IDk1MDcrMTAxNDIsICAKICAgICAgICAgICAgICAgICAgICAiSyIgPSAxMDEyMCs5MzY1LCAgCiAgICAgICAgICAgICAgICAgICAgIlBEUyIgPSAzNDg0NCszNjczNywgCiAgICAgICAgICAgICAgICAgICAgIksmUERTIiA9IDkyMzYrOTk4NSwKICAgICAgICAgICAgICAgICAgICAiUERTJk1vdGlmIiA9IDg5NzMrOTU5MywKICAgICAgICAgICAgICAgICAgICAiSyZNb3RpZiIgPSA0ODA2KzUyMjEsCiAgICAgICAgICAgICAgICAgICAgIksmUERTJk1vdGlmIiA9IDQ4MDIrNTIxMSkpCkZpZzEuQzIgPC0gcGxvdChWZW5uRGlhZy5kb3duLCBjb3VudHMgPSBUUlVFLCBmb250PTEsIGNleD0xLCBhbHBoYT0wLjUsCiAgICAgZmlsbD1nZ19jb2xvcl9odWUoMyksICBxdWFudGl0aWVzID0gbGlzdChmb250c2l6ZSA9IDEwKSkKCgpGaWcxLkMgPC0gcGxvdF9ncmlkKEZpZzEuQzEsIEZpZzEuQzIsIG5yb3c9MSkKRmlnMS5DCmBgYAoKCmBgYHtyfQoKClZlbm5EaWFnLnVwXzIwMTUgPC0gZXVsZXIoYygiTW90aWYiID0gMTgxMzIsICAKICAgICAgICAgICAgICAgICAgICAiSyIgPSAzNDc2MSwgIAogICAgICAgICAgICAgICAgICAgICJQRFMiID0gNTA4OTQsIAogICAgICAgICAgICAgICAgICAgICJLJlBEUyIgPSAzMTcxMSwKICAgICAgICAgICAgICAgICAgICAiUERTJk1vdGlmIiA9IDE0Nzg2LAogICAgICAgICAgICAgICAgICAgICJLJk1vdGlmIiA9IDExNzk0LAogICAgICAgICAgICAgICAgICAgICJLJlBEUyZNb3RpZiIgPSAxMTI1MCkpCnZlbm5fc3VwcC51cCA8LSBwbG90KFZlbm5EaWFnLnVwXzIwMTUsIGNvdW50cyA9IFRSVUUsIGZvbnQ9MiwgY2V4PTEsIGFscGhhPTAuNSwKICAgICBmaWxsPWdnX2NvbG9yX2h1ZSgzKSwgcXVhbnRpdGllcyA9IGxpc3QoZm9udHNpemUgPSAxMCkpCgoKVmVubkRpYWcuZG93bl8yMDE1IDwtIGV1bGVyKGMoIk1vdGlmIiA9IDE5NjQ5LCAgCiAgICAgICAgICAgICAgICAgICAgIksiID0gMzM5MDgsICAKICAgICAgICAgICAgICAgICAgICAiUERTIiA9IDQ5ODA2LCAKICAgICAgICAgICAgICAgICAgICAiSyZQRFMiID0gMzA5MjAsCiAgICAgICAgICAgICAgICAgICAgIlBEUyZNb3RpZiIgPSAxNTk1MSwKICAgICAgICAgICAgICAgICAgICAiSyZNb3RpZiIgPSAxMjYxNSwKICAgICAgICAgICAgICAgICAgICAiSyZQRFMmTW90aWYiID0gMTIwMjcpKQp2ZW5uX3N1cHAuZG93biA8LSBwbG90KFZlbm5EaWFnLmRvd25fMjAxNSwgY291bnRzID0gVFJVRSwgZm9udD0xLCBjZXg9MSwgYWxwaGE9MC41LAogICAgIGZpbGw9Z2dfY29sb3JfaHVlKDMpLCAgcXVhbnRpdGllcyA9IGxpc3QoZm9udHNpemUgPSAxMCkpCgpwbG90X2dyaWQodmVubl9zdXBwLnVwLCB2ZW5uX3N1cHAuZG93biwgbGFiZWxzID0gYygiMycgU3BsaWNlIHNpdGUiLCAiNScgU3BsaWNlIHNpdGUiKSkKCmBgYAoKCgoKCmBgYHtyfQpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llcyA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUxL2RhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzIikKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX21hdHJpeCA8LSB0KGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzKQoKCgpoZWFkZXIgPC0gYXMuY2hhcmFjdGVyKGhlYWQoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfbWF0cml4LCAxKSkKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFpbChkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19tYXRyaXgsIC0xKSkKCmNvbG5hbWVzKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmKSA8LSBoZWFkZXIKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmJHNwZWNpZSA8LSByb3duYW1lcyhkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZikKCgpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCA8LSBkYXRhLnRhYmxlKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmKQoKZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkbWVkaWFuIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JG1lZGlhbikpCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JHN0LmRldiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRzdC5kZXYpKQoKZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkc3BlY2llIDwtIGZhY3RvcihkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRzcGVjaWUgLCBsZXZlbHM9ZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHRbb3JkZXIoLW1lZGlhbildJHNwZWNpZSkKCgoKYGBgCgpgYGB7cn0KRmlnNi5BIDwtIGdncGxvdChkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCwgYWVzKHggPSBzcGVjaWUsIHk9bWVkaWFuKSApICsKICBnZW9tX2Jhciggc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IChtZWRpYW4gLSBzdC5kZXYpLCB5bWF4ID0gKGFzLm51bWVyaWMobWVkaWFuKSArIGFzLm51bWVyaWMoc3QuZGV2KSkpLCBjb2xvdXI9InJlZCIgLCB3aWR0aD0wLjIpICsKICB0aGVtZV9idygpKwogIHhsYWIoIlNwZWNpZXMiKSArCiAgeWxhYigiRGVuc2l0eSAoRzRzIC8ga0IpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43LCAKICAgIGFuZ2xlID0gNDUpKQoKRmlnNi5BCgpgYGAKCmBgYHtyfQoKZGF0YWZyYW1lX2V2b19QRFNfSyA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUxL2RhdGFmcmFtZV9ldm9fUERTX0siKQoKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXggPC0gdChkYXRhZnJhbWVfZXZvX1BEU19LKQoKCgpoZWFkZXIgPC0gYXMuY2hhcmFjdGVyKGhlYWQoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIDEpKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kZiA8LSBhcy5kYXRhLmZyYW1lKHRhaWwoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIC0xKSkKCmNvbG5hbWVzKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpIDwtIGhlYWRlcgoKCmRhdGFmcmFtZV9ldm9fUERTX0tfZGYkU3BlY2llcyA8LSByb3duYW1lcyhkYXRhZnJhbWVfZXZvX1BEU19LX2RmKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kdCA8LSBkYXRhLnRhYmxlKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UgPC0gcmJpbmQoZGF0YWZyYW1lX2V2b19QRFNfS19kdFsgLCAuKFNwZWNpZXM9U3BlY2llcywgVHJlYXRtZW50PSJLKyIsIG1lZGlhbj1LX21lZGlhbiwgc3QuZGV2PUtfc3QuZGV2ICApICBdLApkYXRhZnJhbWVfZXZvX1BEU19LX2R0WyAsIC4oU3BlY2llcz1TcGVjaWVzLCBUcmVhdG1lbnQ9IlBEUyIsIG1lZGlhbj1QRFNfbWVkaWFuLCBzdC5kZXY9UERTX3N0LmRldiAgKSAgXSkKCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UkbWVkaWFuIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRtZWRpYW4pKQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2Ukc3QuZGV2IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRzdC5kZXYpKQoKCmdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4ID0gU3BlY2llcywgeT1tZWRpYW4sIGdyb3VwPVRyZWF0bWVudCkpICsKICBnZW9tX2JhciggYWVzKGNvbG91cj1UcmVhdG1lbnQgKSwgc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIsIHBvc2l0aW9uPSJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gKG1lZGlhbiAtIHN0LmRldiksIHltYXggPSAoYXMubnVtZXJpYyhtZWRpYW4pICsgYXMubnVtZXJpYyhzdC5kZXYpKSksIGNvbG91cj0iYmxhY2siICwgd2lkdGg9MC4yLCAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgdGhlbWVfYncoKSsKICB4bGFiKCJTcGVjaWVzIikgKwogIHlsYWIoIkRlbnNpdHkgKEc0cyAvIGtCKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19kdF9uaWNlJFNwZWNpZXMgPC0gZmFjdG9yKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRTcGVjaWVzICwgbGV2ZWxzPWRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZVtUcmVhdG1lbnQ9PSJQRFMiXVtvcmRlcigtbWVkaWFuKV0kU3BlY2llcykKCgpGaWc2LkMgPC0gIGdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4PVNwZWNpZXMsIHdlaWdodD1tZWRpYW4sIHltaW49bWVkaWFuLXN0LmRldiwgeW1heD1tZWRpYW4rc3QuZGV2LCBncm91cD1UcmVhdG1lbnQpKSArCiAgICAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgYWVzKHk9bWVkaWFuLCBjb2xvcj1UcmVhdG1lbnQpLCBmaWxsPSJ3aGl0ZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgIGdlb21fZXJyb3JiYXIgKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIGNvbG91cj0iYmxhY2siLCB3aWR0aD0wLjIpICsKICAgIHRoZW1lX2J3KCkrCiAgeGxhYigiU3BlY2llcyIpICsKICB5bGFiKCJEZW5zaXR5IChHNHMgLyBrQikiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpCgoKRmlnNi5DCgpgYGAKCmBgYHtyfQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UKYGBgCgoKIyMjIyMjIEZpZ3VyZXMgICMjIyMjCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCkZpZzEuQkMgPC0gcGxvdF9ncmlkKEZpZzEuQiwgRmlnMS5DLCBuY29sPTEsIGxhYmVscyA9IGMoIkIiLCAiQyIpLCByZWxfaGVpZ2h0cyA9IGMoMiwgMSkpCgpGaWcxIDwtIHBsb3RfZ3JpZChGaWcxLkEsIEZpZzEuQkMsIG5yb3c9MSwgbGFiZWxzID0gYygiQSIsICIiKSkKCkZpZzEKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03fQoKRmlnMiA8LSBwbG90X2dyaWQoRmlnMi5BLCBGaWcyLkIsbmNvbCA9IDEgLCBsYWJlbHMgPSJBVVRPIiwgcmVsX2hlaWdodHMgPSBjKDEuNSwgMSkpCkZpZzIKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xNH0KRmlnMy5vbGQgPC0gcGxvdF9ncmlkKEZpZzMuQSwgRmlnMy5CLCBGaWczLkMsIEZpZzMuRCwgbGFiZWxzID0gIkFVVE8iLCBuY29sPTIpCgoKcGxvdF9ncmlkKCBwbG90X2dyaWQoRmlnMy5DLCBGaWczLkQpLCBGaWczLkMubmV3LCBGaWczLkQubmV3LCBuY29sID0gMSkKCgpGaWczLnRvcCA8LSAgcGxvdF9ncmlkKCBGaWczLkIsICBGaWczLkMsIEZpZzMuRCwgRmlnMy5DLm5ldywgbGFiZWxzID0gIkFVVE8iLCBuY29sPTIpCgpGaWczIDwtcGxvdF9ncmlkKEZpZzMudG9wLCBGaWczLkQubmV3LCBsYWJlbHMgPSBjKCIiLCAiRSIpLCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEuNSwgMSkgKQoKCgoKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTR9CkZpZzMuc3VwLnRvcCA8LSAgcGxvdF9ncmlkKEZpZzMuQSwgRmlnMy5zdXAuQiwgbGFiZWxzPSJBVVRPIiwgcmVsX3dpZHRocyA9IGMoMSwgMykgKQpGaWczLnN1cCA8LSBwbG90X2dyaWQoRmlnMy5zdXAudG9wLCBGaWczLnN1cC5DLCBuY29sPTEsIGxhYmVscz1jKCIiLCAiQyIpKQpGaWczLnN1cApgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMy4zNX0KCgoKRmlnNS5ib3R0b20gPC0gcGxvdF9ncmlkKEZpZzUuQSwgRmlnNS5CLCBGaWc1LkMsIEZpZzUuRCwgbnJvdyA9IDIsIG5jb2wgPSAyICwgbGFiZWxzID0gYygiQiIsICJDIiwgIkQiLCAiRSIpLCByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSwgMSkpCgpGaWc1IDwtIHBsb3RfZ3JpZChGaWc1LkExLCBGaWc1LmJvdHRvbSwgbnJvdz0yLCBsYWJlbHMgPSBjKCJBIiwgIiIpLCAgcmVsX2hlaWdodHMgPSBjKDIsIDQpKQoKRmlnNQpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKCkZpZzYudG9wIDwtIHBsb3RfZ3JpZChGaWc2LkEsIEZpZzYuQywgbGFiZWxzID0gYygiQSIsICJDIikpCkZpZzYuYm90dG9tIDwtIHBsb3RfZ3JpZChGaWc2LkIsIEZpZzYuRCwgbGFiZWxzID0gYygiQiIsICJEIikpCgpGaWc2IDwtIHBsb3RfZ3JpZChGaWc2LkEsIEZpZzYuQywgRmlnNi5CICwgRmlnNi5ELCBsYWJlbHMgPSBjKCJBIiwgIkMiLCAiQiIsICJEIikgLCBuY29sPTIsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAzLCAzKSkKCgpGaWc2IDwtIHBsb3RfZ3JpZChGaWc2LnRvcCwgRmlnNi5ib3R0b20sIHJlbF9oZWlnaHRzID0gYygxLCAxLjUpLCBucm93PTIpCkZpZzYKYGBgCgoKCg==